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