Вопрос проверяет понимание механизмов синхронизации потоков и условий возникновения взаимной блокировки (deadlock).
Дедлок (взаимная блокировка) — это ситуация в многопоточном программировании, когда два или более потоков бесконечно ожидают освобождения ресурсов, захваченных друг другом. Это классическая проблема синхронизации, которая может привести к полной остановке приложения.
Для возникновения дедлока необходимо выполнение четырех условий (условия Коффмана):
#include <mutex>
#include <thread>
std::mutex mtx1, mtx2;
void threadA() {
std::lock_guard<std::mutex> lock1(mtx1);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock2(mtx2); // ждет mtx2
}
void threadB() {
std::lock_guard<std::mutex> lock2(mtx2);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock1(mtx1); // ждет mtx1
}
int main() {
std::thread t1(threadA);
std::thread t2(threadB);
t1.join();
t2.join();
return 0;
}В этом примере threadA захватывает mtx1, а threadB — mtx2. Затем каждый пытается захватить другой мьютекс, что приводит к дедлоку.
Дедлок — опасная ситуация, которую необходимо предотвращать на этапе проектирования. Соблюдение порядка блокировок и использование современных средств синхронизации (например, std::lock) помогает избежать взаимных блокировок в многопоточных приложениях.