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

в чем разница между двумя выше?

этот вопрос пришел мне на ум, потому что я нашел, что

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

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

Это правда?

также во время поиска я нашел это статьи

любой разъяснения пожалуйста.

2 ответов


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

синхронизация означает, что синхронизации/порядок доступа нескольких потоков к общему ресурсу.
Рассмотрим пример:
Если у вас есть два потока, 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
  }
}

в приведенном выше коде переменная мьютекса обеспечивает взаимное исключение (позволяет только одному потоку получить доступ к критическому разделу), тогда как полная и пустая переменные используются для показать состояние(для aribtrate доступа к общему ресурсу из разных потоков).