c++26新功能—风险指针

一、多线程的安全

在前面反复的对多线程中的资源安全管理进行了分析说明,从整体上说,多线程中的资源控制主要分成两大方向即传统的有锁编程和后来提出的无锁编程(CAS)。对于使用传统的有锁编程的方式来说,一般来说重点是处理资源提高效率;但对于无锁编程来说,由于无锁编程的特点,重点是解决ABA问题和何时进行资源回收的问题。毕竟无锁编程无法控制资源的访问控制情况,也就不能准确的获取释放的时机。

二、C++标准的应对

对于解决这些问题,开发者是各展神通,不管好坏,终归是有适应自己应用的具体方法。但既然这些问题在多线程中出现,标准就不得不认真对待分析,如果适合加入标准,还是要在标准中解决。毕竟,在标准的加持下,不管是对应用方还是开发方,都是一种利好的事情。
也就是说,C++标准要对无锁编程中的数据结构对象的内存回收形成一个标准机制,从而将多线程中的资源管理进行更广泛的覆盖。

三、风险指针

风险指针,hazard_pointer就是C++26标准中提供的解决上述问题的一种方法。它为并发编程提供资源特别是内存的延迟清理机制,灵活的处理内存等资源的管理。风险指针其实就是类似于一写多读的指针。风险指针本身如果不是空就一定是指向一个节点内存块。而这个节点只能为所有线程写入,但可以被其它线程读取。
风险节点的删除是先将不使用的节点保存在一个线程私有的列表中,在到达一个阀值后,线程就会扫描其它的纯种的风险指针,看其是否与列表中的指定节点相关,如果证明无关后,则该节点不可以直接回收了。否则,会继续保留此节点直到下次扫描再重复上述的过程。
上面的分析只是一个非常笼统的说明,如果想知道风险指针的更详细的内容,可以查找一个相关的草案资料或其它相关的资料如《C++并发编程实战》中就有类似的说明。但一定要明白,它们之间的细节的不同。
不过,目前的资料显示,风险指针还是没有解决ABA问题,这个需要等最终标准出来后再看。

四、例程

风险指针目前还没有很明确的应用,草案中有一个例子,大家看看就可以了,不必纠结:

struct Name : public hazard_pointer_obj_base<Name> { /∗ details ∗/ };
atomic<Name*> name;
// called often and in parallel!
void print_name() {
hazard_pointer h = make_hazard_pointer();
Name* ptr = h.protect(name); /∗ Protection epoch starts ∗/
8
/... safe to access ∗ptr .../
} /∗ Protection epoch ends./
// called rarely, but possibly concurrently with print_name
void update_name(Name* new_name) {
Name* ptr = name.exchange(new_name);
ptr->retire();
}

上面的代码显示了风险指针在并发情况下对读取线程的更新。

五、总结

不过在网上看到的资料都提到可能这个风险指针在C++26很可能无法实现了,虽然标准前期提到了,但最终能否真正进入标准,还得看具体的业务推进。不过确实如前面所讲,最终的标准一天不发布,就无法确定到底其中包含了什么。如果真得没有,大家就当后面的更新标准的一个模块吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值