2012-02-10 26 views
2

スレッドと同期のしくみについて混乱します。私はこのように記述されているサンプル問題を処理中です:スレッドと同期

2つのスレッドがあります:PとQ変数は、両方のスレッドで共有されます。 一方のスレッドのカウンタの変更は他方のスレッドから見えます。 インクリメント命令は、変数に1を加算して新しい値を格納します。

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 

カウンタの値を出力する3つのprint文があります。以下の出力 のリストでは、指定された出力が可能かどうかを示し、そうであれば に、 が出力につながるPおよびQのインターリーブ命令(スレッドおよびライン番号を使用)を与えます。

この例では出力122が可能ですか?これはP4, Q9, Q10, P5, Q11, Q12によって生成することができる。私はこの仕組みの周りに頭を包むことはできません。

答えて

4

スレッドPが最初に開始し、「カウンタ」が1だけ増分すると仮定します。その後、中断され、スレッドQが始まり、 "counter"が読み込まれ、その値( "1")が出力されます。次のスレッドQは「カウンタ」をインクリメントし、現在は「2」になっています。その後、スレッドQは中断され、スレッドPは継続する。これで "カウンタ"が読み込まれ、その値( "2")が表示されます。スレッドPは終了します。スレッドQは継続して、「カウンタ」(「2」)を読み取り、印刷する。次に、「カウンタ」を1だけインクリメントします。

出力は、したがって、次のとおりです。実行の一つの可能​​なシーケンスだ「122」

。一般的に言えば、スレッドが中断されたときとそれが続くときは決して分かりませんが、それはこのエクササイズの要点です。同期メカニズム(この例では完全に欠けている)を追加することによって、実行の順序を再度制御することができます。