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