技术解析

定义一个 a=1; 然后起三个线程去执行 a=a+1; 那么最终的执行结果会是什么呢?
0
2021-06-09 17:34:17
idczone
经过测试, 如果抗投诉服务器直接启动 3 个线程,都是执行 a=a+1 等待一段时间输出的结果一直为 4. 如果在每个执行线程启动后都立即启动另外的其他业务线程, 那么多次尝试等待输出的结果是 2. 不同的 CPU 数量应该也会影响结果, 再有些特殊的情况下, 可能会出现 3 的情况.
你需要补充多线程和并行的基础知识。答案是 unknown,根据 cpu 调度,1-4 之间全部可能。

这不是操作系统里面并发的基本例子吗,自己跑一下比你问强多了。

未定义行为

我觉得是 2-4 之间

you are right

对 我脑抽了。

涉及可重入性,单纯地问答案其实没有什么意义

不作线程锁的话,2-4 都有可能。


结果为 4 的可能性是最大的,2 和 3 的情况比 segement fault 还要罕见

做好并发控制,答案就是 4

随机的

等待足够的时间,a 就是 4 。

都执行完不是 4 吗。

a=a+1 够复杂耗时的话,结果应该就会有明显差异了

这个 都有可能。

首先我们排除掉 0[狗头]

再排除掉 1[狗头]

读 1 、写 1 、读 2 、写 2 、读 3 、写 3
除了读 n 位于写 n 之前外其他操作随机排列组合,就可以得出所有可能的结果

现代计算机,没特殊情况,99%可能是 4
当然你要起十万个线程就不可能正好

那要看你用的是 atomic 还是非 atomic 的,算法有没有加锁等等情况,atomic/正确加锁的就是 4,其他的随机 2-4 都有可能。

count1: 0
count2: 29
count3: 1539222
count4: 32334689
用 go 程试了一下

![image.png]( https://i.loli.net/2021/03/19/NzQfkTFAnZYt5lc.png)
刚学 go,这样写对不对,这个模拟的是不加锁的效果

第一个把 a 读出来的最后一个写回去咋办

如果 a 是基本数据类型,多核 cpu 空载下大概率是 2
但是本身这个写法结果是不可预知的。

欢迎投入 ponylang 怀抱,答案是“你不可能让两个 actor 同时写,没有一个 capability 支持这样操作”

线程的启动依赖于 OS 调度,有先后顺序,3 个线程同时读到 a=1 是非常小概率的事

没有说语言环境,没有说 a 是局部还是全局变量,连示例代码都没有,猜毛线?

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服