我有两个线程共享一个循环队列。队列的内容是无符号数字(unsigned long
在 x86_64 上)。一个线程是生产者,另一个是消费者。如果队列中元素的值为 0,则生产者仅写入队列中的元素,并且生产者始终产生非零值,而消费者仅在其值为非零时才使用它。此外,消费者在消费时将元素重置为 0,以便生产者知道消费者已经消费了它。
现在我的想法是,由于使用这种方案,队列中的元素有严格的访问顺序,我们不需要使用同步或原子变量。我的假设正确吗?或者我在这里遗漏了什么?请记住,x86_64 具有相对严格的一致性内存模型,并且只能将不相关的加载放在存储之前。它还具有缓存一致性,可以主动更新缓存。我还使用volatile
变量来确保编译器不会缓存它们。