无锁作业队列(多次读/写) - 请求审核

时间:2014-04-09 12:54:06

标签: c++ templates c++11 atomic

我一直在寻找一个*简单的无锁作业队列,可以通用的方式跨平台使用。

*没有外部依赖关系,只有少数调用接口,没有可能从编译器到编译器的异常编译器技巧,最好只有标头。

要么我在谷歌搜索,或者这是不可用的。 (它们不是相互排斥的,但你明白了)

1 个答案:

答案 0 :(得分:2)

在推送功能中,设为两点:

Line 1: start_.compare_exchange_strong( tmp, newnode );
Line 2: node_ptr prev_end = end_.exchange( newnode ); // and set next pointer

现在,考虑两个调用push的线程:

                start   end     a.next  b.next
Begin           null    null    -       -
TA.push(a) - 1  a       null    null    null
TB.push(b) - 1  a       null    null    null
TB.push(b) - 2  a       b       null    null
TA.push(a) - 2  a       a       null    a

如您所见,b在列表中丢失。