我在一个多处理器机器上有一个C++中的布尔类型变量。变量一开始是true,然后有一些线程,任意一个或多个线程可能会将其写为false。
同时,这些线程也可能读取这个变量来检查它的状态。我不关心读取该变量是否与任何写入同步,它们每个都发生在代码的不同位置,并且无论它在任何特定的写入之前还是之后,都没有关系。那么,我需要为这个布尔值加锁吗?
我只有在非常低层次上需要锁,即如果内存可能因两个竞争的写入而受到破坏。例如,处理器A上的汇编指令正在向表示布尔值的字节写入0,同时处理器B也在做同样的事情……而内存最终不是写入了0,而是值22或其他某些东西。那会对某些事情造成麻烦。
所以,通常情况下,如果处理器A正在将3写入内存位置,而处理器B正在写入7,没有同步,我能否保证最终至少得到3或7其中之一?还是说打破内存太容易了?
编辑:
谢谢大家的评论。以下是更多信息:程序中当然有同步机制。总之,被讨论的标志表示某个内存池是否“脏”(需要压缩)。因此,任何线程都可以决定将此标志设置为false(表示该池是脏的)。例如,从池中释放内存会使其变脏。然后,任何线程也可以读取此标志并设置另一个标志以表示需要进行清理——如果我们的内存不足,则在从池中分配内存时执行此检查。在我的主要关键部分之间的迭代中,在每个线程寻找更多要处理的数据时,我将使线程检查此第二个标志,并执行适当的操作,以确保所有其他线程完成当前迭代,一个线程清理内存,将第一个标志设置回true(即池不脏了),将第二个标志设置回false,然后再次释放所有线程。
我认为我不需要锁,因为锁可以确保写操作不会与另一个写操作或读操作同时发生。但是谁在乎呢,只要硬件不让我失望,最坏情况是读操作随机在写操作之前或之后发生--如果我用锁来保护它,这个结果也是一样的,只不过那时我们会更加确信它在写操作之前或之后发生了...
我认为同样的论点适用于我上面提到的第二个标志。
true
还是false
,那么为什么还要进行读取操作呢?难道只是因为“错误”的true
读取是无害的吗? - Steve Jessop