【发布时间】:2009-10-29 17:28:13
【问题描述】:
C++ 中是否有线程安全、非阻塞的队列类?
可能是一个基本的问题,但我已经很久没有做 C++了...
编辑:删除了 STL 要求。
【问题讨论】:
-
boost::lockfree::queue?
标签: c++ thread-safety
C++ 中是否有线程安全、非阻塞的队列类?
可能是一个基本的问题,但我已经很久没有做 C++了...
编辑:删除了 STL 要求。
【问题讨论】:
boost::lockfree::queue ?
标签: c++ thread-safety
假设您的 CPU 具有双指针范围的比较和交换(compxchg8b 在 486 或更高版本上,compxchg16b 在大多数 amd64 机器上 [英特尔的一些早期型号上不存在])...有一个算法 @987654321 @。
更新:如果您不怕做一些工作,将其转换为 C++ 并不难。 :P
这个算法假设一个“带标签的指针”结构,如下所示:
// Be aware that copying this structure has to be done atomically...
template <class T>
struct pointer
{
T *ptr;
uintptr_t tag;
};
然后你想用一些内联汇编包装指令lock cmpxchg{8|16}b...
也许你可以这样写队列节点:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
其余的或多或少是我链接到的算法的转录......
【讨论】:
由于当前的 C++ 标准甚至不承认线程的存在,所以在 STL 或标准库的任何其他部分中肯定没有线程安全的。
【讨论】:
这似乎是 Dobb 博士去年的热门话题:
【讨论】:
您需要自己实现它或使用实现它的库。要自己做,你可能想看看这个:
【讨论】:
现在可能为时已晚。为了将来参考,这是一个很好的无锁队列实现(内置线程安全,有一些警告)。
多生产者 - 多消费者
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++
【讨论】:
简短的回答 - 不。 STL 本身不关心并发性(至少在规范级别上)。当前的 C++ 标准没有提到线程。
不过,您可以轻松地在 STL 和 Boost 之上构建这样的队列 - 只需将 std::queue 和 boost::mutex 包装在您的自定义类中。
【讨论】:
STL 容器不是线程安全的,您应该对并发访问实施处理。
有这个项目 (C++) 旨在提供并发访问:CPH STL
和paper about。
【讨论】:
目前非官方的Boost.Lockfree 值得考虑。我同时使用 FIFO 和 atomic 类型。
【讨论】: