为什么没有锁定的单生产者单用户循环队列线程是安全的?

时间:2013-01-03 15:34:41

标签: algorithm data-structures thread-safety

这似乎是真的,但我的想法一直很混乱。 有人可以给出一个明确的解释和一些关键的案例,在这种情谢谢!

2 个答案:

答案 0 :(得分:3)

这肯定取决于循环队列的实现。但是,如果它是我想象的那么你有两个索引 - 队列的headtail。制作人使用tail,消费者使用head。它们共享消息数组,但使用两个不同的指针。

生产者和消费者可能发生冲突的唯一情况是例如消费者检查新消息,它在检查后到达。然而,在这种情况下,消费者将稍等一下并再次检查。程序的正确性不会丢失。

单个生产者单个消费者可以正常工作的原因主要是因为这两个用户没有共享大量内存。如果是多个生产者,例如您将拥有多个访问head的线程,并且可能会引发冲突。

编辑,因为dasblinkenlight在他的评论中提到我的推理只有在两个线程增加/减少其各自的计数器作为其消耗/生成的最后一个操作时才成立。

答案 1 :(得分:2)

单个生产者背后的真正技巧 - 单个消费者循环队列是头部和尾部指针被修改为原子。这意味着如果存储器中的位置从值A变为值B,则在其值被改变时读取存储器的观察者(即读取器)将得到A或B作为结果,没有别的。

因此,例如,如果您使用的是16位指针但是要在两个8位步骤中更改它们,那么您的队列将无法工作(这可能会发生,具体取决于您的CPU架构和内存对齐要求)。在这种情况下,读者可能会读取完全错误的瞬态值。

因此,请确保您的指针在您的平台中以原子方式进行修改!