2012-04-11 18 views
13

上記2つの違いは何ですか?私は相互排除と同期の違いは?

  1. モニターとロックが

  2. セマフォや条件変数相互排他を提供し、同期

ですを提供することを見つけたので

この質問は私の心に来ましたこれは本当ですか?検索中

また、私は、これはarticle

任意の明確化が喜ばました。

答えて

19

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

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

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 
    } 
} 

がsynchonizationために使用される(種々のスレッド間で共有リソースへのアクセスをaribtrateします)。

関連する問題