Разница между взаимным исключением и синхронизацией?
В чем разница между двумя выше?
Этот вопрос пришел мне на ум, потому что я обнаружил, что
Это правда?
Также при поиске я нашел эту статью
Любые разъяснения, пожалуйста.
Ответы
Ответ 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 обеспечивает взаимное исключение (разрешить доступ только одному потоку к критическому разделу), тогда как полная и пустая переменная используются для синхронизации (для аранжировки доступа к совместно используемому ресурсу между различными потоками).