上記2つの違いは何ですか?私は相互排除と同期の違いは?
モニターとロックが
セマフォや条件変数相互排他を提供し、同期
ですを提供することを見つけたので
この質問は私の心に来ましたこれは本当ですか?検索中
また、私は、これはarticle
任意の明確化が喜ばました。
上記2つの違いは何ですか?私は相互排除と同期の違いは?
モニターとロックが
セマフォや条件変数相互排他を提供し、同期
ですを提供することを見つけたので
この質問は私の心に来ましたこれは本当ですか?検索中
また、私は、これはarticle
任意の明確化が喜ばました。
相互排除は、任意の時点で共有リソースにアクセスできるスレッドが1つだけであることを意味します。これにより、リソースを獲得するスレッド間の競合状態が回避されます。モニタとロックはそのような機能を提供します。
同期は、複数のスレッドから共有リソースへのアクセスを同期/順序付けすることを意味します。
例を考えてみましょう: 2つのスレッドがある場合、Thread 1
& Thread 2
です。
Thread 1
とThread 2
Thread 1
はThread 2
は、その配列に声明B
を実行しなければならないこと絶対必要であるその配列に声明A
を言う実行する前に、並列に実行しますが。ここで必要なのは同期です。セマフォはこれを提供します。ステートメントA
の前にsemapohore待機を入れて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
}
}
がsynchonizationために使用される(種々のスレッド間で共有リソースへのアクセスをaribtrateします)。