我对线程和同步的工作原理感到困惑。我正在解决一个示例问题,描述如下:
有两个线程: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
共有三个打印语句输出计数器的值。在输出中 下面列出,指示给定的输出是否可能,如果是,则给出 P 和 Q 的交错指令(使用线程和行号) 可以导致输出。
示例输出为 122,这可能吗?可以由P4、Q9、Q10、P5、Q11、Q12
生成。我无法理解这是如何工作的。
最佳答案
假设线程 P 首先启动并将“counter”加一。然后它被挂起,线程 Q 启动,读取“counter”并打印其值(“1”)。下一个线程 Q 递增“counter”,现在是“2”。然后线程 Q 被挂起,线程 P 继续运行。现在它读取“counter”并打印其值(“2”)。线程 P 终止。线程 Q 继续,读取并打印“counter”(“2”)。然后它将“计数器”增加 1。
因此输出为:“122”
这是一种可能的执行顺序。一般来说,您永远无法判断线程何时被挂起以及何时继续,这就是本练习的重点。通过添加同步机制(本示例完全缺乏),您可以再次控制执行顺序。
关于multithreading - 线程和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226959/