Вопрос проверяет понимание базовых механизмов синхронизации в многопоточном программировании и их различий.
Мьютекс (от mutual exclusion) — это простейший примитив синхронизации, который гарантирует, что только один поток может выполнять критическую секцию кода в любой момент времени. Он работает как замок: поток, который хочет получить доступ к общему ресурсу, должен сначала захватить мьютекс. Если мьютекс уже захвачен другим потоком, новый поток блокируется до его освобождения.
Монитор — это более сложная конструкция, которая включает в себя мьютекс, условные переменные и защищаемые данные. Он предоставляет высокоуровневый интерфейс для синхронизации, позволяя потокам не только взаимно исключать доступ, но и ждать определенных условий. Например, в Java каждый объект имеет встроенный монитор, который используется с ключевым словом synchronized.
public class SharedResource {
private int value;
private boolean available = false;
public synchronized void produce(int v) throws InterruptedException {
while (available) wait();
value = v;
available = true;
notify();
}
public synchronized int consume() throws InterruptedException {
while (!available) wait();
available = false;
notify();
return value;
}
}#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int shared_data;
void* thread_func(void* arg) {
pthread_mutex_lock(&mutex);
shared_data++; // критическая секция
pthread_mutex_unlock(&mutex);
return NULL;
}Вывод: Мьютекс подходит для простых случаев взаимного исключения, когда не требуется ожидание условий. Монитор удобен для сложных сценариев синхронизации, таких как producer-consumer, где потоки должны ждать определенных состояний данных.