Ниже приведен класс condition, определяющий одноименный примитив:
class Condition
{
bool event; ThreadQueue tq; public: // очередь потоков
Condition(bool b): event(b) {} // конструктор
~Condition() {} // деструктор
void Signal() // сигнализировать о том, что условие выполнено
{ disable interrupt(); if(!tq.DequeueThread()) event = true; // запрещаем прерывания
enable interrupt(); // разрешаем прерывания
void Wait(Thread t) // ждать выполнения условия
{
disable interrupt(); // запрещаем прерывания
if(event)
event = false; // сбрасываем условие
else tq.EnqueueThread(t) ; // ставим поток в очередь ожидания
enable interrupt(); // разрешаем прерывания
}
}; Этот примитив может использоваться для решения как задачи условной синхронизации, так и задачи взаимного исключения.
|