我对线程和同步如何工作感到困惑。我正在处理一个样本问题,如下所示:
有两个线程:P和Q.变量counter由两个线程共享。 一个线程中的计数器修改对另一个线程可见。该 递增指令将一个加到变量中,存储新值。
1 global integer counter = 0
2
3 thread P()
4 incr(counter)
5 print counter
6 end
7
8 thread Q()
9 print counter
10 incr(counter)
11 print counter
12 incr(counter)
13 end
有三个print语句输出counter的值。在输出中 在下面的列表中,指出给定的输出是否可能,如果是,则给出 P和Q的交织指令(使用线程和行号) 可以导致输出。
示例有输出122是否可能?这可以由P4, Q9, Q10, P5, Q11, Q12
产生。我无法理解这是如何运作的。
答案 0 :(得分:4)
假设线程P首先开始并将“计数器”增加1。然后它被挂起并且线程Q开始,读取“计数器”并打印其值(“1”)。下一个线程Q递增“计数器”,现在为“2”。然后线程Q被挂起并且线程P继续。它现在读为“counter”并打印其值(“2”)。线程P终止。线程Q继续,读取并打印“计数器”(“2”)。然后它将“计数器”加1。
因此输出为:“122”
这是一个可能的执行顺序。一般来说,你永远无法分辨线程何时被暂停以及何时继续,这就是本练习的重点。通过添加同步机制(这个例子完全没有),您可以再次控制执行顺序。