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