多线程对变量的修改问题

时间:2021-09-05 18:07:07
在单CPU下:
两个线程:
线程A:
for(int i=0;<5;i++){        
  x++;
}
线程B:
for(int j=0;j<5;j++){
  x++;
}
线程A和线程B共享变量x。
问:执行后x的值会是多少?值的范围在哪?两个极端的值产生的内部原理

10 个解决方案

#1


不是很明白、、、
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。

#2


对这种错误的应用,不要探讨所谓的原理。
重要的是,你要明白怎样正确应用,以及为什么要这样用。

怎么用?
在这个例子中,你需要的是使用原子操作来修改x。即使用interlocked相关函数,即使用lock指令前缀,对xadd指令加原子化修饰。当然你也需要读取x的值,必须要在定义上的x前加volatile修饰,这样会在读取x值的时候,由编译器默认添加栅栏指令。


#3


没法共享吧,要用到锁来进行操作。

#4


没法共享吧,要用锁来进行操作。

#5


没法进行共享吧,要用锁来操作。

#6


这样多线程编程是不安全的。

#7


多线之间若共享一个全局变量,必须进行同步操作,
信号量,锁等等

#8


假设x = 0, 正常的情况是加10 次,会变成10 。
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
 范围是5~10.

#9


引用 8 楼 ugly927846 的回复:
假设x = 0, 正常的情况是加10 次,会变成10 。
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
 范围是5~10.

X的初始值是0,并不是在循环里面赋值的,而是之前就是0了

#10


全局变量 多线程访问 
加锁吧 

#1


不是很明白、、、
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。

#2


对这种错误的应用,不要探讨所谓的原理。
重要的是,你要明白怎样正确应用,以及为什么要这样用。

怎么用?
在这个例子中,你需要的是使用原子操作来修改x。即使用interlocked相关函数,即使用lock指令前缀,对xadd指令加原子化修饰。当然你也需要读取x的值,必须要在定义上的x前加volatile修饰,这样会在读取x值的时候,由编译器默认添加栅栏指令。


#3


没法共享吧,要用到锁来进行操作。

#4


没法共享吧,要用锁来进行操作。

#5


没法进行共享吧,要用锁来操作。

#6


这样多线程编程是不安全的。

#7


多线之间若共享一个全局变量,必须进行同步操作,
信号量,锁等等

#8


假设x = 0, 正常的情况是加10 次,会变成10 。
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
 范围是5~10.

#9


引用 8 楼 ugly927846 的回复:
假设x = 0, 正常的情况是加10 次,会变成10 。
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
 范围是5~10.

X的初始值是0,并不是在循环里面赋值的,而是之前就是0了

#10


全局变量 多线程访问 
加锁吧