两个线程:
线程A:
for(int i=0;<5;i++){
x++;
}
线程B:
for(int j=0;j<5;j++){
x++;
}
线程A和线程B共享变量x。
问:执行后x的值会是多少?值的范围在哪?两个极端的值产生的内部原理
10 个解决方案
#1
不是很明白、、、
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。
#2
对这种错误的应用,不要探讨所谓的原理。
重要的是,你要明白怎样正确应用,以及为什么要这样用。
怎么用?
在这个例子中,你需要的是使用原子操作来修改x。即使用interlocked相关函数,即使用lock指令前缀,对xadd指令加原子化修饰。当然你也需要读取x的值,必须要在定义上的x前加volatile修饰,这样会在读取x值的时候,由编译器默认添加栅栏指令。
重要的是,你要明白怎样正确应用,以及为什么要这样用。
怎么用?
在这个例子中,你需要的是使用原子操作来修改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.
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
范围是5~10.
#9
X的初始值是0,并不是在循环里面赋值的,而是之前就是0了
#10
全局变量 多线程访问
加锁吧
加锁吧
#1
不是很明白、、、
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。
x没有定义(报错)或定义没有初值(结果是随机值,很大的负数)。
其他的不得而知,帮顶、、、期待结果。
#2
对这种错误的应用,不要探讨所谓的原理。
重要的是,你要明白怎样正确应用,以及为什么要这样用。
怎么用?
在这个例子中,你需要的是使用原子操作来修改x。即使用interlocked相关函数,即使用lock指令前缀,对xadd指令加原子化修饰。当然你也需要读取x的值,必须要在定义上的x前加volatile修饰,这样会在读取x值的时候,由编译器默认添加栅栏指令。
重要的是,你要明白怎样正确应用,以及为什么要这样用。
怎么用?
在这个例子中,你需要的是使用原子操作来修改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.
极端的情况是:A线程刚进入循环x=0 赋值,B线程已经开始循环结束了,但由于A线程已经把x的值变成0了。所以x= 5.
范围是5~10.
#9
X的初始值是0,并不是在循环里面赋值的,而是之前就是0了
#10
全局变量 多线程访问
加锁吧
加锁吧