所以,假设我有一个struct A { int val1; int val2};
和一个std::queue<A> fifo
两个线程,Reader线程:从A读取所有内容,并清除。写入线程:一次写入一个 A 到队列。
std::queue 是否足以维护一个具有一个读取器和一个写入器的无锁线程安全 fifo 容器?如果没有,任何其他 stl 容器可以工作吗?dequeue 是 std::queue 中的默认底层。
所以,假设我有一个struct A { int val1; int val2};
和一个std::queue<A> fifo
两个线程,Reader线程:从A读取所有内容,并清除。写入线程:一次写入一个 A 到队列。
std::queue 是否足以维护一个具有一个读取器和一个写入器的无锁线程安全 fifo 容器?如果没有,任何其他 stl 容器可以工作吗?dequeue 是 std::queue 中的默认底层。
不,您绝对不能直接为此使用任何 STL 容器。您可以使用 C++ 已经存在的许多无锁队列实现中的任何一个。您应该搜索“SPSC”,意思是单一生产者、单一消费者。例如,来自 Boost: http: //www.boost.org/doc/libs/1_59_0/doc/html/boost/lockfree/spsc_queue.html
一个无等待、固定大小的实现就在这里:SPSC lock free queue without atomics(但请注意那里的答案和评论,它们解释了问题中的实现并不完全安全的一些方法,并提供了一些解决方案)。