RED*_*AIR 77 c++ stl lock-free
我一直在谷歌搜索C++中的无锁队列.我发现了一些代码和一些试验 - 但我没有能够编译.也欢迎无锁哈希.
摘要:到目前为止,我没有正面答案.没有"生产就绪"库,令人惊讶的是现有的库都没有符合STL容器的API.
Ste*_*ham 25
其出发点是,要么香草萨特的文章DDJ对于任何一个单一的生产者和消费者或多个的.他给出的代码(在每篇文章的第二页开始内联)使用C++ 0x样式的atomic <T>模板类型; 您可以使用Boost进程间模型进行模拟.
增强代码隐藏在进程间库的深处,但是通过读取相应的头文件(atomic.hpp),我熟悉的系统上必要的比较和交换操作的实现看起来很合理.
Cam*_*ron 16
我写了一个无锁队列.它有Features™:
它可以在GitHub上以简化的BSD许可证获得(随意分叉!).
注意事项:
And*_*ves 15
Facebook的Folly似乎拥有基于C++ 11的无锁数据结构<atomic>:
ProducerConsumerQueue 这里有docs和示例代码.
AtomicHashMap与文档和示例代码这里
我敢说这些目前在生产中使用,所以我猜他们可以安全地用于其他项目.
干杯!
RED*_*AIR 10
在检查了大部分给定答案后,我只能说:
答案是否定的.
没有这样的东西可以直接使用.
如果你有一个多生产者/单一消费者队列/ FIFO,你可以使用SLIST或一个简单的无锁LIFO堆栈轻松制作一个LockFree.你所做的是为消费者提供第二个"私人"堆栈(为简单起见,你也可以将其作为SLIST或你选择的任何其他堆栈模型).消费者将物品从私人堆栈中弹出.每当私有LIFO被呼出时,你会执行Flush而不是Pop共享并发SLIST(抓取整个SLIST链),然后按顺序将Flushed列表推送到私有堆栈.
这适用于单一生产者/单一消费者和多生产者/单一消费者.
但是,它不适用于多个消费者案例(单一生产者或多生产者).
此外,就哈希表而言,它们是"条带化"的理想候选者,其仅将哈希分成具有每个高速缓存段锁定的段.这就是Java并发库的工作方式(使用32条纹).如果你有一个轻量级的读写器锁,可以同时访问哈希表以便同时读取,并且只有在有争议的条带上发生写入时才会停止(并且可能如果你允许增加哈希表).
如果您自己滚动,请确保将您的锁与哈希条目交错,而不是将所有锁定放在一个数组中,这样您就不太可能进行错误共享.