Подтвердить что ты не робот

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

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

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

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

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

Это правда?

Также при поиске я нашел эту статью

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

4b9b3361

Ответ 1

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

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

Ответ 2

Лучший способ понять разницу - с помощью примера .Below - это программа для решения классической проблемы производителя-производителя через семафор. Чтобы обеспечить взаимное исключение, мы в основном используем двоичный семафор или мьютекс и обеспечиваем синхронизацию, которую мы используем считая семафор.

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

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