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

jld*_*ont 25 c++ thread-safety

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

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

编辑:删除STL要求.

asv*_*kau 17

假设你的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;
};
Run Code Online (Sandbox Code Playgroud)

然后你想lock cmpxchg{8|16}b用一些内联asm 包装说明...

也许那时你可以像这样编写队列节点:

template <class T>
struct queue_node
{
    T value;
    pointer<queue_node<T> > next;
};
Run Code Online (Sandbox Code Playgroud)

其余的或多或少是我链接到的算法的转录...

  • @jldupont:-1对此太过骚扰了.Asveikau为您提供了与算法的良好链接,只需几分钟即可将其转换为C++.-1完全不需要在这里 (12认同)
  • 如果你实际上没有进行投票,为什么说-1?这简直令人困惑.:p (10认同)
  • 都2013年了,C++还没有标准的线程安全队列库吗?有多少开发者不得不重新编写同样的东西? (3认同)

sbi*_*sbi 6

由于当前的C++标准甚至不承认线程的存在,因此在STL或标准库的任何其他部分中肯定没有线程安全的.


Cli*_*ord 6

这似乎是Dobb博士去年的热门话题: