C ++中的非阻塞线程安全队列?

时间:2009-10-29 17:28:13

标签: c++ thread-safety

C ++中是否存在线程安全的非阻塞队列类?

可能是一个基本问题,但我很长一段时间没有做过C ++ ......

编辑:删除了STL要求。

8 个答案:

答案 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)

您需要自己实现它或使用实现它的库。要自己做,你可能想看看这个:

Implementing a Thread-Safe Queue using Condition Variables

答案 4 :(得分:1)

STL容器不是线程安全的,您应该实现并发访问的处理方法 有一个项目(C ++)旨在提供并发访问:CPH STL
paper about

答案 5 :(得分:1)

简短回答 - 不。 STL并不关心并发性(至少在规范级别上)。当前的C ++标准没有提及线程。

您可以轻松地在STL和Boost之上构建这样的队列 - 只需在自定义类中包装std::queueboost::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++

https://github.com/cameron314/readerwriterqueue

答案 7 :(得分:0)

目前非官方的Boost.Lockfree是需要考虑的事情。我同时使用FIFO和原子类型。