当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《是否可以让多个线程将相同的值写入相同的变量?》经验,为你挑选了1个好方法。

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

GlobalVar.property = 11;

(假设该属性永远不会被分配除11以外的任何东西),如果多个线程同时执行它会导致问题?



1> Torne..:

当你回读那个状态并做一些事情时,就会出现问题.写作是一个红色的鲱鱼 - 确实,只要这是一个单词,大多数环境保证写入将是原子的,但这并不意味着包含此片段的更大代码片段是线程安全的.首先,大概你的全局变量包含一个不同的值 - 否则如果你知道它始终是相同的,为什么它是变量?第二,大概你最终会再次读到这个值?

问题是,大概是,你正在写这个共享状态的一个原因 - 发出信号已经发生了什么?这就是它失败的地方:当你没有锁定结构时,根本没有隐含的内存访问顺序.很难指出这里有什么问题,因为你的例子实际上并没有包含变量的使用,所以这里是中性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上,即使编译器没有对事物进行重新排序,也可以在单独处理器的高速缓存之间重新排序存储器写入.

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有