我一直在寻找一个*简单的无锁作业队列,可以通用的方式跨平台使用。
*没有外部依赖关系,只有少数调用接口,没有可能从编译器到编译器的异常编译器技巧,最好只有标头。
要么我在谷歌搜索,或者这是不可用的。 (它们不是相互排斥的,但你明白了)
答案 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在列表中丢失。