Для моего приложения я должен быть уверен, что в критический сеанс обрабатывается только один тип потока. Количество потоков для данного типа не указано и может быть «большим». Я пришел с простым решением:Три типа потоков, пытающихся получить доступ к критическому разделу
MutableInt a,b,c;
Semaphore mutex;
void enterA() {
while (true) {
mutex.acquire();
if (b.intValue() == 0 && c.intValue() == 0) {
a.increase();
break;
}
mutex.release();
}
}
void exitA() {
while(true) {
mutex.acquire();
a.decrease();
mutex.release();
}
}
Я пропуск обработки исключений и B & C часть вызвать его просто копипаст.
Работает так, как ожидалось (возможность голодания голосом в порядке), но сгенерированная нагрузка слишком велика. Нитки постоянно проверяют счетчики. Я чувствую, что есть другое решение, но не могу придумать ни одного примера.
Причина высокой загрузки процессора заключается в том, что один поток всегда может работать. В вашем коде нет блокирующих вызовов, кроме mutex.acquire(). Поэтому я полагаю, что одно ядро ЦП постоянно находится на 100%. – tbsalling
Thx для обобщения, однако этот, я действительно знаю. Я пытаюсь выяснить способ уведомления только тех потоков, которые заинтересованы в событии. – yusuf