题
是有一线的安全、无阻止队列类在C++?
可能是一个基本问题,但我没有做C++很长一段时间...
编辑: 除STL项要求。
解决方案
假设你的CPU有一双指针的范围的比较和交换(compxchg8b在486或更高,compxchg16b在最amd64机[不存在一些早期的模型,通过英特尔])...有一个算法 在这里,.
更新:这不是很难把这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
与一些联asm...
也许你可以写的队列中的节点是这样的:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
其余的是或多或少转录的算法我相联系。
其他提示
由于当前的C ++标准甚至不承认线程的存在,有肯定是没有什么的线程安全的STL或标准库的任何其他部分。
这似乎是一个普遍的主题上的博士Dobb的最后一年度:
您需要实现它自己或使用库执行它。要自己做,你可能想看看这个:
-safe队列短答案 - 没有。 STL不并发关注自身(至少在规范层面。)当前的C ++标准只字未提线程。搜索结果
您可以轻松地构建这样的队列对STL的顶部和Boost虽然 - 只是包装std::queue
和boost::mutex
在你的自定义类
可能为时已晚了。对于未来的参考,这个人是一个很好的实现无锁队列(建于线程安全的一些注意事项)的。
多生产者 - 消费者的多
HTTP:// moodycamel。 COM /博客/ 2014 / A-快速通用锁 - 自由队列换C ++
https://github.com/cameron314/concurrentqueue
单生产者 - 消费者单
在目前非官方 Boost.Lockfree 是要考虑的事情。我同时使用FIFO和原子类型。