如何找出线程交错的所有可能组合?

时间:2015-03-07 03:20:42

标签: multithreading operating-system combinations race-condition

假设我们有两个线程T1和T2 ..

T1 has 5 print statements 
print X1
print X2
print X3
print X4
print X5

T2 has 3 print statements 
print Y1
print Y2
print Y3

当T1和T2交错时,输出序列可能有哪些组合?这些类型的问题是否有固定的关系或公式 - 找到所有可能的结果?

除了蛮力方法,我们还有什么方法可以接近它?

1 个答案:

答案 0 :(得分:1)

没有普遍适用的规则。关于唯一可以依赖的是单个线程中的指令将相对于彼此按顺序执行(*)。来自多个线程的指令的相对排序完全取决于操作系统,并且可以从OS到OS,从一种类型的硬件到另一种硬件或从一个时刻到下一个时刻而变化。在多核CPU上,谈论来自不同线程的指令排序甚至没有意义,因为两个线程可以(并且经常是)在字面上完全相同的瞬间执行指令,每个都在不同的核心上

当然,指令执行的顺序完全不能保证与文本从stdout流中出现的顺序相同。一些stdio实现可以序列化将文本添加到stdout流的调用,而其他调用可能不会,这意味着您可能根本不一定看到预期的输出行,或者它们可能以意想不到或不可预测的方式被提取。

非同步/非确定性行为是一大堆蠕虫;很多部分的多线程编程都在学习如何以及何时同步执行,以便在100%的时间内获得可靠的结果(而不仅仅是99%的时间)。

(*)实际上,你甚至不能指望它,因为编译器和/或CPU可能会重新排列它们以使代码更有效地执行。但至少他们constrained只能重新安排它们,以便重新排列指令'可观察行为与指令仍处于原始序列时的行为相同。请注意,这些约束仅适用于与同一线程中的其他代码的交互;当谈到与其他线程的非同步交互时,所有的赌注都会关闭。