Проверяет понимание примитива синхронизации мьютекс, его отличия от семафора и умение применять его для защиты разделяемых данных от гонок.
Мьютекс (mutual exclusion) — это объект синхронизации, который гарантирует, что в определённый момент времени только один поток выполняет код, работающий с общим ресурсом. Когда поток входит в критическую секцию, он захватывает мьютекс, а остальные потоки, пытающиеся сделать то же самое, блокируются до его освобождения.
Без синхронизации несколько потоков могут одновременно читать и изменять одну переменную, что приводит к гонкам данных и непредсказуемому результату. Мьютекс сериализует доступ к таким данным.
#include <mutex>
#include <thread>
#include <iostream>
std::mutex mtx;
int counter = 0;
void increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> lock(mtx); // захват и авто-освобождение
++counter;
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join(); t2.join();
std::cout << counter; // всегда 200000
}Семафор — счётчик разрешений, мьютекс — бинарный владелец. Мьютекс обычно может освободить только тот поток, который его захватил, что упрощает отладку и предотвращает ошибки.
Итог: мьютекс применяют везде, где несколько потоков обращаются к общим изменяемым данным, чтобы обеспечить корректность и предсказуемость многопоточной программы.