Механика состояния. Сигнал () - PullRequest
0 голосов
/ 08 января 2011

Если бы у меня были потоки, как показано ниже

void thread(){

while() {

lock.acquire();

if(condition not true)

{

Cond.wait()

}

// blah blah

Cond.Signal();

lock.release();
}
}

Ну, я думаю, мой главный вопрос заключается в том, продолжает ли поток сигнализации работать некоторое время после cond.signal () или сразу же отказывается от процессора?Я хотел бы, чтобы в некоторых случаях не снималась блокировка до того, как разбудивший поток завершит выполнение, а в некоторых других случаях может быть полезно снять блокировку сразу после передачи сигнала, не дожидаясь завершения другого разбудившего потока.

Я понимаю, что если какие-либо потоки ожидают выполнения условия, они просыпаются в Cond.signal ().Но что вы имеете в виду под woekn up - поставить в готовую очередь или планировщик должен убедиться, что он запускается немедленно?а как насчет потока сигнализации ... он переходит в спящий режим в том же состоянии при передаче сигналов?... тогда какой-то другой поток должен разбудить его, чтобы он снял блокировку?.

1 Ответ

1 голос
/ 08 января 2011

Это в значительной степени зависит от вашей среды (ОС, библиотека, язык ...) и от того, как реализованы примитивы синхронизации.Поскольку вы ничего не указали, я просто дам общий ответ.

При переводе потока в спящий режим большая часть среды выберет его удаление из очереди готовности планировщика, а поток откажется от оставшегося ЦП.время.При пробуждении поток просто помещается обратно в готовую очередь и возобновляет выполнение в следующий раз, когда планировщик выберет его из очереди.

Возможно также, что поток вместо этого выполнит некоторое активное ожидание (вращение)быть удаленным из готовой очереди планировщика.В этом случае поток возобновит выполнение сразу же.Обратите внимание, что, поскольку поток все еще может быть исчерпан из ЦП во время вращения, ему, возможно, придется подождать, чтобы быть перепланированным, прежде чем проснуться.Это полезная стратегия, если ваши критические разделы очень малы, и вы не хотите платить за планирование.

Гибридный подход заключается в том, чтобы сделать небольшое количество активного ожидания перед удалением потока из очереди готовности планировщика.

Что касается потока сигнализации, если это явно не указано в вашей среде (я могуне по каким-либо причинам, но вы никогда не знаете), я не ожидал бы, что вызов signal () будет блокироваться таким образом, что вам придется его разбудить.Возможно, Signal () придется синхронизировать с другими потоками, вызывающими signal (), но это детали реализации, и вам не нужно ничего с этим делать.

...