线程池任务序列中的访问冲突问题?

C++ Concurrency in Action 6.2 Lock-based concurrent data structure中的thread_safe_queue是通过引入了一个头节点来解决这个问题:每次pop_head时先锁head,再短暂的锁上tail - 获取tail指针 - 释放tail锁,如果head == tail就证明没有有效节点直接返回失败,否则不需再次获取tail锁直接修改head即可。这样既保证了正确性,锁上tail的时间也尽可能小。
■网友
boost.lockfree
■网友
添加一个虚拟元素,让链表最小就一个元素,所以有任务的时候链表的start永远不等于end还有,大量任务同时并发的话建议用array,因为这样可以一次分配多个任务给一个线程,减少线程挂起和重新申请任务带来的额外开销


    推荐阅读