2012-02-10 109 views
2

我很困惑线程和同步如何工作。我正在处理一个示例问题,如下所示:线程和同步

有两个线程: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生成。我无法把我的头围绕着它如何工作。

回答

4

假设线程P首先启动并将“counter”加1。然后暂停并启动线程Q,读取“计数器”并打印其值(“1”)。下一个线程Q递增“计数器”,现在是“2”。然后线程Q被挂起,线程P继续。它现在读取“计数器”并打印其值(“2”)。线程P终止。线程Q继续,读取并打印“计数器”(“2”)。然后它增加一个“柜台”。因此

的输出是:“122”

这就是执行的一个可能的序列。一般来说,你永远无法知道线程何时暂停,何时继续,这就是本练习的重点。通过添加同步机制(这个例子完全没有),你可以再次控制执行的顺序。