无锁操作的本质依赖的原子操作,c++11提供了atomic的原子操作支持 atomic compare_exchange_weak / compare_exchange_stron
无锁操作的本质依赖的原子操作,c++11提供了atomic的原子操作支持
atomic
compare_exchange_weak / compare_exchange_strong
当前值与期望值相等时,修改当前值为设定值,返回true
当前值与期望值不等时,将期望值修改为当前值,返回falsememory_order枚举值
template<typename T>
class lock_free_stack
{
private:
struct node
{
T data;
node* next;
node(T const& data_):
data(data_)
{
}
};
std::atomic<node*> head;
public:
void push(T const& data)
{
node* const new_node=new node(data);
new_node->next=head.load();
while(!head.compare_exchange_weak(new_node->next,new_node));
}
};
示例代码如下:
bool compare_and_swap ( int *memory_location, int expected_value, int new_value)
{
if (*memory_location == expected_value)
{
*memory_location = new_value;
return true;
}
return false;
}
所谓ABA(见维基百科的ABA词条),问题基本是这个样子:
虽然P1以为变量值没有改变,继续执行了,但是这个会引发一些潜在的问题。ABA问题最容易发生在lock free 的算法中的,CAS首当其冲,因为CAS判断的是指针的地址。如果这个地址被重用了呢,问题就很大了。(地址被重用是很经常发生的,一个内存分配后释放了,再分配,很有可能还是原来的地址)
eg:
好比你拿着一个装满钱的手提箱在飞机场,此时过来了一个火辣性感的美女,然后她很暖昧地挑逗着你,并趁你不注意的时候,把用一个一模一样的手提箱和你那装满钱的箱子调了个包,然后就离开了,你看到你的手提箱还在那,于是就提着手提箱去赶飞机去了。
这就是ABA的问题。
Fetch-And-Add (FAA)
一般用来对变量做+1的原子操作
Test-And-Set (TAS)
写值到某个内存位置并传回其旧值
参考文章
C++11:原子交换函数compare_exchange_weak和compare_exchange_strong
到此这篇关于C++11如何实现无锁队列的文章就介绍到这了,更多相关C++11无锁队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++11如何实现无锁队列
本文链接: https://lsjlt.com/news/132353.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0