web-dev-qa-db-ja.com

相互排除と同期の違いは?

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

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

  1. モニターとロックは相互排除を提供します

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

これは本当ですか?

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

ご不明な点がございましたら、どうぞ。

20
Tanya

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

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

23
Alok Save

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

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つのスレッドのみがクリティカルセクションにアクセスできるようにします)、完全変数と空の変数は同期に使用されます(さまざまなスレッド間で共有リソースへのアクセスを制限します)。

0
akashchandrakar