100并发线程各执行100次count自增的极值问题咨询
问题解答
你的推导完全正确,不存在任何合法的线程执行交错路径,能让所有线程运行结束后count的最终值小于100。
最大值取值说明
- 最大可能值为10000,触发场景就是你提到的线程完全无交错串行执行:每个线程执行时,其他线程完全不抢占CPU,单个线程的100次循环会依次完成读、算、写全流程,不会出现读了旧值被其他线程覆盖写入的情况。总增量为
100线程 * 100次自增/线程 = 10000,符合预期。
题目给出的竞态代码如下:
for i in range(100): temp = count count = temp + 1
这段代码的核心问题是自增操作被拆成了「读共享变量到临时变量」「临时变量+1」「写回共享变量」三个独立步骤,线程调度可以在任意步骤之间切换,才会出现最终结果偏离10000的竞态问题。
最小值取值说明
- 最小可能值确实为100,你推导的「每轮所有线程先统一完成读操作,再统一完成写操作」的场景是可以真实发生的:
- 第1轮循环:所有线程先后读取到count的初始值0,之后先后执行写回操作,最后一个完成写回的线程会把count设为1,这一轮整体只给count加了1
- 第2轮循环:所有线程先后读取到count=1,再先后写回,最终count被设为2,同样只加1
- 重复上述逻辑直到100轮循环全部执行完,最终count的值就是100
为什么不可能出现比100更小的值?
我们可以用归纳法简单证明下界:
- 初始状态count=0,没有任何线程完成任何一轮循环。
- 当所有线程都完成第k轮循环时,count的值至少为k:要完成第k轮的写操作,每个线程读到的count值至少是k-1(否则说明它还没等到上一轮的最终写入完成,不可能进入第k轮的读阶段),因此最后一个完成第k轮写操作的线程,写回的值至少是
(k-1)+1 = k。 - 当所有线程都完成全部100轮循环时,对应k=100,因此count的最终值至少为100,不可能更小。
内容的提问来源于stack exchange,提问作者Ali Khan
相关产品推荐
相关产品推荐

