2016-12-03 10 views
0

これはどのように答えるのですか?助けてください。C++で複数スレッドの並列プログラミングをロック

3つのスレッドで次のプログラムを検討してください。

locks l1, l2, l3; 

*スレッド1

while(1){ 

l1.lock(); 

l2.lock(); 

printf(“Red”); 

l3.unlock(); 

l1.unlock();} 

*スレッド2

while(1){ 

l2.lock(); 

l3.lock(); 

printf(“Green”); 

l1.unlock(); 

l2.unlock();} 

*スレッド3

while(1){ 

l3.lock(); 

l1.lock(); 

printf(“Blue”); 

l2.unlock(); 

l3.unlock();} 

a)は、上記のプログラムの可能な結果はどのようなものです。これがどうなるか説明できますか? b)このコードはデッドロックにつながるでしょうか?

+0

ロックは抽象概念ですが、タイプの定義を指定できますか? 'ロック'?これはおそらく有用かもしれませんhttp://stackoverflow.com/questions/9382122/whats-the-difference-between-mutex-and-lock – Rama

答えて

0

はreadiblyのために、私は、スレッドが最初に実行を開始した配列(例えばlock[0], lock[1], lock[2]

A)依存するロックを参照します。レッド、ブルー、グリーン、レッド、ブルー、...

  • 最初のスレッド2を開始した場合::ブルー、グリーン、レッド、ブルー、グリーン、...
  • 最初のスレッド1つの開始されると

    1. スレッド3が最初に開始する場合:緑、赤、青、緑、赤、...

    B)はい、できます。それはおそらくそうなるだろう。それを考えてみましょう:

    1. スレッド1つのロックlock[0]
    2. スレッド2つのロックlock[1]
    3. スレッドlock[2]ロックするスレッド2
    4. スレッド2トライを待っ3つのロックlock[2]
    5. lock[1]をロックするスレッド1トライ、スレッド3を待っている
    6. スレッド3ロックしようlock[3]、スレッド1を待つ
  • +0

    スレッド間の切り替え方法について説明できますか?私はそれで明確ではない –

    +0

    実際のコンピュータでは、スケジューラ(通常はOSの一部である)に完全に依存するため、完全にランダムに見えることがあります。今のところコンピュータはマルチコアなので、スレッドは実際には並行して実行されるため、何も言いません。 – minary

    +0

    さらに読むために、私はWikipedia minary

    1

    実際に何をl1.lock()l1.unlock()などにするかによって異なります。これはタグ付きC++である(タイトルはCだが)、これらの関数呼び出しがstd::mutexオブジェクトを管理している場合、結果は未定義の動作であり、ロックされていないmutexのロックを解除する。

    +0

    あなたはもう少し私のためにそれらをしてください説明することができますか? –

    +0

    C++のmutexのルールは、mutexのロックを解除できるのは、ロックしたスレッドだけです。しかし、既に別の答えを受け入れているので、私はそれ以上の議論をすることはありません。 –

    +0

    私はあなたが別の答えを受け入れて何を意味するのか分かりません。あなたは、さらに緑のチェックマークは、(あなたが今削除したことを)あなたは問題の正しい解決策として、答えを受け入れたことを意味し –

    関連する問題