多线程 – 让多个线程将相同的值写入相同的变量是否可以?

我了解竞争条件以及多个线程如何访问同一个变量,一个更新所做的更新可以被其他人忽略和覆盖,但是如果每个线程都将相同的值(不是不同的值)写入同一个变量,那该怎么办呢?甚至可能导致问题?这段代码可以:

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上,即使编译器没有对事物进行重新排序,也可以在单独处理器的高速缓存之间重新排序存储器写入.

如果这似乎没有为您解答,请在问题中包含您的示例的更多详细信息.如果不使用变量,就不可能明确地说明这种用法是否安全.

转载注明原文:多线程 – 让多个线程将相同的值写入相同的变量是否可以? - 代码日志