【问题标题】:How to find out all possible combinations of thread interleaving?如何找出线程交错的所有可能组合?
【发布时间】:2016-02-03 17:08:46
【问题描述】:

假设我们有两个线程 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 交错时,输出序列的可能组合是什么?这类问题是否有固定的关系或公式——找出所有可能的结果?

除了蛮力法,我们还有什么其他方法?

【问题讨论】:

  • 为什么?如果您关心交错,您可以使用信号量或同步来控制它,或者根本不使用线程。

标签: multithreading operating-system combinations race-condition


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多