我正在寻找一个*简单的无锁作业队列,它可以以通用的方式跨平台使用。
*没有外部依赖项,只有很少的接口调用,没有可能在不同编译器之间中断的奇特编译器技巧,最好只有头
要么我不擅长谷歌搜索,要么这不可用。(它们不是互斥的,但你明白了)
在推送功能中,让标记两点:
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在列表中丢失了。