Вопрос проверяет знание механизмов синхронизации потоков, необходимых для предотвращения состояния гонки и обеспечения корректной работы многопоточных приложений.
В многопоточном программировании несколько потоков могут одновременно обращаться к общим ресурсам (например, переменным, файлам, структурам данных), что приводит к состоянию гонки (race condition) и неопределённому поведению. Синхронизация потоков — это набор методов, которые координируют выполнение потоков, гарантируя корректность и предсказуемость программы.
#include
#include
#include
std::mutex mtx;
int shared_counter = 0;
void increment() {
for (int i = 0; i < 1000; ++i) {
mtx.lock(); // Захватываем мьютекс
++shared_counter; // Безопасное изменение
mtx.unlock(); // Освобождаем мьютекс
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter: " << shared_counter << std::endl; // Всегда 2000
return 0;
}В этом примере мьютекс защищает общий счётчик, гарантируя, что два потока не изменят его одновременно. Без мьютекса результат мог бы быть меньше 2000 из-за состояния гонки.
Синхронизация используется везде, где есть многопоточность: веб-серверы (обработка запросов), базы данных (транзакции), GUI-приложения (отзывчивый интерфейс), игровые движки (физика и рендеринг). Выбор механизма зависит от задачи: мьютексы — для эксклюзивного доступа, семафоры — для ограничения пула ресурсов, атомарные операции — для простых операций без блокировок.
Вывод: Используйте синхронизацию потоков при разработке многопоточных приложений для предотвращения конфликтов и обеспечения целостности данных. Мьютексы подходят для большинства случаев эксклюзивного доступа, а атомарные операции — для оптимизации производительности при простых операциях.