C ++中是否存在线程安全的非阻塞队列类?
可能是一个基本问题,但我很长一段时间没有做过C ++ ......
编辑:删除了STL要求。
答案 0 :(得分:17)
假设您的CPU具有双指针范围的比较和交换(486或更高版本的compxchg8b,大多数amd64机器上的compxchg16b [英特尔在某些早期型号上不存在])...有一个算法{{ 3}}
更新:如果你不害怕做一些工作,将它翻译成C ++并不难。 :P
此算法假定“带标记的指针”结构如下所示:
// Be aware that copying this structure has to be done atomically...
template <class T>
struct pointer
{
T *ptr;
uintptr_t tag;
};
然后你想用一些内联asm ...
包装说明lock cmpxchg{8|16}b
也许你可以像这样编写队列节点:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
其余的或多或少是我链接到...的算法的转录。
答案 1 :(得分:6)
由于当前的C ++标准甚至不承认线程的存在,因此在STL或标准库的任何其他部分中肯定没有线程安全的。
答案 2 :(得分:6)
这似乎是Dobb博士去年的热门话题:
答案 3 :(得分:2)
您需要自己实现它或使用实现它的库。要自己做,你可能想看看这个:
答案 4 :(得分:1)
STL容器不是线程安全的,您应该实现并发访问的处理方法
有一个项目(C ++)旨在提供并发访问:CPH STL
和paper about。
答案 5 :(得分:1)
简短回答 - 不。 STL并不关心并发性(至少在规范级别上)。当前的C ++标准没有提及线程。
您可以轻松地在STL和Boost之上构建这样的队列 - 只需在自定义类中包装std::queue
和boost::mutex
。
答案 6 :(得分:1)
现在可能为时已晚。为了将来参考,这个是一个很好的无锁队列实现(内置线程安全与一些警告)。
多生产者 - 多消费者
http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++
https://github.com/cameron314/concurrentqueue
单一生产者 - 单一消费者
http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++
答案 7 :(得分:0)
目前非官方的Boost.Lockfree是需要考虑的事情。我同时使用FIFO和原子类型。