- нитка 1 занимается делением (DivideNode)
- нитка 2 ждет на семафоре
Деление закончено, новый нод добавлен, счетчик семафора = 1. Но ведь нет никаких гарантий, что после этого именно нитка 2 снимется с семафора и захватит мутекс. Это может быть опять нитка 1, которая продолжает крутить свой while.
Пусть нитка 1 опять захватила мутекс. Тогда если нитка 2 успела сняться с семафора, она ждет на мутексе (захваченном ниткой 1). А нитка 1 (ведь есть ноды для деления) отправляется ждать на семафоре, закрытом ниткой 2. Имеем deadlock
Не имеем. Поскольку перед попаданием на семафор нитка 1 разблокирует мутекс:
if(!sem.tryAcquire()) {
if(!ActiveThreadCount && !GetNodeCount()) {
locker.unlock();
sem.release();
break;
} else {
locker.unlock();
// нитка 1 разблокирует мутекс и только после этого попадает на семафор
sem.acquire();
locker.lock();
// нитка 2 снялясь с семафора ждет на мутексе
}
}