如何计算多线程运行指定函数时可产生的不同输出的最大数量
问题前提
全局共享变量x初始值为0,三个线程分别执行的逻辑为:
- 线程1:
x = x + 2 - 线程2:
x = x * 3 - 线程3:
x = x + 5
所有赋值操作均非原子,可拆分为读x、计算、写回x三个独立步骤,上下文切换可发生在任意步骤间隙。
高效计算方法
不需要穷举所有上下文切换组合,核心是抓住操作的读写顺序带来的覆盖、叠加效果,按逻辑分类统计即可:
- 完全串行场景:三个操作没有任何步骤穿插,全排列共6种执行顺序,对应6种输出结果。
- 存在操作覆盖场景:某个操作读取x后,其他操作先完成写回,该操作最终写回的结果会覆盖中间其他操作的结果。这类场景按「最后生效的写操作、提前读的操作」分类计算即可,不需要梳理所有中间切换细节。
12种输出的验证逻辑
你已经找到了11种输出值,还差1种即可凑齐总数,验证方法如下:
- 先确定输出的取值范围:最小为0,最大为22,逐一排查范围内的所有整数是否存在对应的合法执行序列。
- 对每个整数,只要能找到至少一种读写顺序可以得到该值,就计入有效结果,否则直接排除。
- 逐一验证后可发现,该范围内刚好只有12个整数能对应到合法执行序列,不存在更多可能的取值,因此最大不同输出数就是12。
内容的提问来源于stack exchange,提问作者Soske
相关产品推荐
相关产品推荐

