Важно, чтобы это происходило

Автор admin Суббота, 27 июня 2009 11:32

Важно, чтобы это происходило в защищенной секции, для которой программный поток установил блокировку (в нашем примере — созданием объекта Guard). При вызове wait() программный поток приостанавливается, а блокировка снимается. Снятие блокировки абсолютно необходимо, поскольку для безопасного изменения состояния объекта (например, для перевода waxOn в состояние true, без которого поток вообще не сможет продолжить работу) блокировка должна стать доступной для ее установления другой задачей. Когда в нашем примере другой поток вызывает waxedQ, сообщая о завершении своей части работы, для перевода waxOn Кооперация между программными потоками 573 в состояние true функция waxed() должна захватить мутекс. Затем waxed() вызывает для объекта Condition функцию signal(), что приводит к возобновлению потока, приостановленного вызовом wait(). Хотя функция signal() может вызываться в защищенной секции кода, как в нашем примере, это не является обязательным требованием1. Чтобы программный поток возобновил свою работу после вызова waitQ, он должен сначала заново захватить мутекс, освобожденный при входе в wait(). Поток


Комментарии закрыты.