定义一个 a=1; 然后起三个线程去执行 a=a+1; 那么最终的执行结果会是什么呢?

2021-03-19 12:06:29 +08:00
 shunfy
4043 次点击
所在节点    程序员
27 条回复
yamasa
2021-03-19 12:16:48 +08:00
你需要补充多线程和并行的基础知识。答案是 unknown,根据 cpu 调度,1-4 之间全部可能。
Chenamy2017
2021-03-19 12:29:02 +08:00
这不是操作系统里面并发的基本例子吗,自己跑一下比你问强多了。
nightwitch
2021-03-19 12:29:15 +08:00
未定义行为
ingin
2021-03-19 12:42:09 +08:00
@yamasa 我觉得是 2-4 之间
pkwenda
2021-03-19 12:57:16 +08:00
@ingin #4 you are right
yamasa
2021-03-19 13:06:19 +08:00
@ingin 对 我脑抽了。
CEBBCAT
2021-03-19 13:11:21 +08:00
涉及可重入性,单纯地问答案其实没有什么意义
webcoder
2021-03-19 14:11:40 +08:00
不作线程锁的话,2-4 都有可能。
ch2
2021-03-19 14:17:29 +08:00

结果为 4 的可能性是最大的,2 和 3 的情况比 segement fault 还要罕见
beat
2021-03-19 14:23:00 +08:00
做好并发控制,答案就是 4
gdt
2021-03-19 14:37:36 +08:00
随机的
xuanbg
2021-03-19 14:47:55 +08:00
等待足够的时间,a 就是 4 。
hauibojek
2021-03-19 15:03:12 +08:00
都执行完不是 4 吗。
cxe2v
2021-03-19 15:08:09 +08:00
a=a+1 够复杂耗时的话,结果应该就会有明显差异了
hejw19970413
2021-03-19 15:30:38 +08:00
这个 都有可能。
nullllllllllllll
2021-03-19 15:51:22 +08:00
首先我们排除掉 0[狗头]
norz
2021-03-19 16:18:35 +08:00
@nullllllllllllll 再排除掉 1[狗头]
faceRollingKB
2021-03-19 16:23:08 +08:00
读 1 、写 1 、读 2 、写 2 、读 3 、写 3

除了读 n 位于写 n 之前外其他操作随机排列组合,就可以得出所有可能的结果
realpg
2021-03-19 16:36:18 +08:00
现代计算机,没特殊情况,99%可能是 4

当然你要起十万个线程就不可能正好
mingl0280
2021-03-19 17:23:33 +08:00
那要看你用的是 atomic 还是非 atomic 的,算法有没有加锁等等情况,atomic/正确加锁的就是 4,其他的随机 2-4 都有可能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/763156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX