线程和同步

时间:2012-02-10 11:18:31

标签: multithreading synchronization pthreads

我对线程和同步如何工作感到困惑。我正在处理一个样本问题,如下所示:

有两个线程: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产生。我无法理解这是如何运作的。

1 个答案:

答案 0 :(得分:4)

假设线程P首先开始并将“计数器”增加1。然后它被挂起并且线程Q开始,读取“计数器”并打印其值(“1”)。下一个线程Q递增“计数器”,现在为“2”。然后线程Q被挂起并且线程P继续。它现在读为“counter”并打印其值(“2”)。线程P终止。线程Q继续,读取并打印“计数器”(“2”)。然后它将“计数器”加1。

因此输出为:“122”

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