是有一线的安全、无阻止队列类在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::queueboost::mutex在你的自定义类

STL容器不是线程安全的,你应该实现你的治疗并发访问。结果 有这个项目(C ++),其目的是服务的并发访问: CPH STL
关于纸。

可能为时已晚了。对于未来的参考,这个人是一个很好的实现无锁队列(建于线程安全的一些注意事项)的。

多生产者 - 消费者的多

HTTP:// moodycamel。 COM /博客/ 2014 / A-快速通用锁 - 自由队列换C ++

https://github.com/cameron314/concurrentqueue

单生产者 - 消费者单

http://moodycamel.com/blog/ 2013 / A-快速锁定 - 自由队列换C ++

https://github.com/cameron314/readerwriterqueue

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top