22

上記の2つの違いは何ですか?

この質問が頭に浮かんだのは、

  1. モニターとロックによる相互排除

  2. セマフォと条件変数は同期を提供します

これは本当ですか?

また、検索中にこの記事を見つけました

明確化してください。

4

2 に答える 2

29

相互排除とは、特定の時点で単一のスレッドのみが共有リソースにアクセスできるようにすることを意味します。これにより、リソースを取得するスレッド間の競合状態が回避されます。モニターとロックは、そのための機能を提供します。

同期とは、共有リソースへの複数のスレッドのアクセスを同期/順序付けすることを意味します。
例を考えてみましょう:
2 つのスレッドがある場合、Thread 1& Thread 2. 並行して実行しますが、そのシーケンスでステートメントを実行する前に
Thread 1、そのシーケンスでステートメントを実行する必要があります。ここで必要なのは同期です。セマフォがそれを提供します。のステートメントの前にセマフォ待機を配置し、 のステートメントの後にセマフォにポストします。 これにより、必要な同期が保証されます。Thread 2Thread 1AThread 2BAThread 1BThread 2

于 2012-04-11T06:52:12.863 に答える
0

違いを理解する最良の方法は、例を使用することです.以下は、セマフォを介して古典的な生産者と消費者の問題を解決するプログラムです.相互排除を提供するには、一般的にバイナリセマフォまたはミューテックスを使用し、同期を提供するには、カウントセマフォを使用します.

BufferSize = 3;

semaphore mutex = 1;              // used for mutual exclusion
semaphore empty = BufferSize;     // used for synchronization
semaphore full = 0;               // used for synchronization

Producer()
 {
  int widget;

   while (TRUE) {                  // loop forever
     make_new(widget);             // create a new widget to put in the buffer
     down(&empty);                 // decrement the empty semaphore
     down(&mutex);                 // enter critical section
     put_item(widget);             // put widget in buffer
     up(&mutex);                   // leave critical section
     up(&full);                    // increment the full semaphore
   }
 }

Consumer()
{
  int widget;

   while (TRUE) {                  // loop forever
     down(&full);                  // decrement the full semaphore
     down(&mutex);                 // enter critical section
     remove_item(widget);          // take a widget from the buffer
     up(&mutex);                   // leave critical section
     consume_item(widget);         // consume the item
  }
}

上記のコードでは、ミューテックス変数は相互排他を提供します (1 つのスレッドのみがクリティカル セクションにアクセスできるようにする) のに対し、フル変数と空の変数は同期化に使用されます (さまざまなスレッド間で共有リソースへのアクセスを調整するため)。

于 2014-11-13T07:55:19.903 に答える