2012-04-11 5 views
13

В чем разница между двумя вышеуказанными?Разница между взаимным исключением и синхронизацией?

Этот вопрос пришел мне в голову, потому что я обнаружил, что

  1. Мониторы и замки обеспечивают взаимное исключение

  2. семафоры и условные переменные обеспечивают синхронизацию

ли это правда?

Кроме того, при поиске я нашел это article

Любые уточнения пожалуйста.

ответ

19

Взаимное исключение означает, что только один поток должен иметь доступ к общему ресурсу в любой данный момент времени. Это позволяет избежать условий гонки между потоками, получающими ресурс. Мониторы и замки обеспечивают функциональность для этого.

Синхронизация означает, что вы синхронизируете/заказываете доступ нескольких потоков к общему ресурсу.
Рассмотрите пример:
Если у вас есть два потока, Thread 1 & Thread 2.
Thread 1 и Thread 2 выполнять параллельно, но до Thread 1 можно выполнить сказать о A в своей последовательности это является обязательным, что Thread 2 должен выполнить инструкцию B в своей последовательности. Здесь вам нужна синхронизация. Семафор обеспечивает это. Вы ставите семафоры перед заявлением A в 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 доступа общего ресурса среди различных ниток).

 Смежные вопросы

  • Нет связанных вопросов^_^