我理解竞争条件以及多个线程如何访问同一个变量,一个更新所做的更新可以忽略并被其他人覆盖,但是如果每个线程都在向同一个变量写入相同的值(不是不同的值),那该怎么办呢?甚至可能导致问题?这段代码可以:
GlobalVar.property = 11;
(假设该属性永远不会被分配除11以外的任何东西),如果多个线程同时执行它会导致问题?
当你回读那个状态并做一些事情时,就会出现问题.写作是一个红色的鲱鱼 - 确实,只要这是一个单词,大多数环境保证写入将是原子的,但这并不意味着包含此片段的更大代码片段是线程安全的.首先,大概你的全局变量包含一个不同的值 - 否则如果你知道它始终是相同的,为什么它是变量?第二,大概你最终会再次读到这个值?
问题是,大概是,你正在写这个共享状态的一个原因 - 发出信号已经发生了什么?这就是它失败的地方:当你没有锁定结构时,根本没有隐含的内存访问顺序.很难指出这里有什么问题,因为你的例子实际上并没有包含变量的使用,所以这里是中性C语法的一个简单例子:
int x = 0, y = 0; //thread A does: x = 1; y = 2; if (y == 2) print(x); //thread B does, at the same time: if (y == 2) print(x);
线程A将始终打印1,但它对于线程B打印0完全有效.线程A中的操作顺序只需要从线程A中执行的代码中观察到 - 线程B可以看到状态的任何组合.对x和y的写入可能实际上不是按顺序发生的.
即使在单处理器系统上也会发生这种情况,大多数人都不希望这种重新排序 - 您的编译器可能会为您重新排序.在SMP上,即使编译器没有对事物进行重新排序,也可以在单独处理器的高速缓存之间重新排序存储器写入.
如果这似乎没有为您解答,请在问题中包含您的示例的更多详细信息.如果不使用变量,就不可能明确地说明这种用法是否安全.