Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
void threadA() {
ResetEvent(flag); // это асимметричная зависимость: очередь сообщений, сокет, условная переменная и т.п.
Enter(mutex1);
Enter(mutex2);
Leave(mutex2);
Leave(mutex1);
SetEvent(flag);
}
void threadB() {
WaitEvent(flag);
Enter(mutex2);
Enter(mutex1);
Leave(mutex1);
Leave(mutex2);
}
volatile bool ready; // да, я знаю про неэффективность volatile, но это же псевдокод.
Some data;
void threadA() {
while(!ready) {
// возможно, в тестовом прогоне мы сюда просто никогда не попадём
DoSomeIdleWork(); // с мьютексами и прочим добром
Sleep(0);
}
Consume(data); // пусть там всё защищено и аккуратно
}
void threadB() {
Sleep(rand());
Produce(data);
ready = true;
if(rand()) // ещё один способ не попасть в сложное положение
DoAnotherIdleWork(); // чтобы заклинило с DoSomeIdleWork
}
Динамический поиск потенциальных взаимоблокировок