上記の2つの違いは何ですか?
この質問が頭に浮かんだのは、
モニターとロックは相互排除を提供します
セマフォと条件変数は同期を提供します
これは本当ですか?
また、検索中にこれを見つけました 記事
ご不明な点がございましたら、どうぞ。
相互排除は、任意の時点で共有リソースにアクセスできるのは1つのスレッドのみであることを意味します。これにより、リソースを取得するスレッド間の競合状態が回避されます。モニターとロックは、そうするための機能を提供します。
Synchronizationは、共有リソースへの複数のスレッドのアクセスを同期/順序付けすることを意味します。
例を考えてみましょう:
スレッドが2つある場合は、Thread 1
&Thread 2
。Thread 1
とThread 2
は並行して実行されますが、Thread 1
が実行される前に、ステートメントA
を順番に実行する必要があります。Thread 2
ステートメントB
をその順序で実行する必要があります。ここで必要なのは同期です。セマフォはそれを提供します。 Thread 1
のステートメントA
の前にセマフォ待機を置き、Thread 2
のステートメントB
の後にセマフォに投稿します。
これにより、必要な同期が保証されます。
違いを理解する最良の方法は、例を使用することです。以下は、セマフォを介して古典的な生産者消費者問題を解決するプログラムです。相互排除を提供するために、一般にバイナリセマフォまたはミューテックスを使用し、同期を提供するために、カウントセマフォを使用します。
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つのスレッドのみがクリティカルセクションにアクセスできるようにします)、完全変数と空の変数は同期に使用されます(さまざまなスレッド間で共有リソースへのアクセスを制限します)。