2013-03-24 5 views
2

Что произойдет, если complete_all() вызывается на объекте завершения (от задачи B) до задачи получает сделать wait_for_completion() на объекте завершения? Есть ли какой-нибудь API, чтобы найти, если объект уже завершен во время ожидания и сразу же возвращается? Одним из способов может быть использование mutex, который заблокирован перед отправкой сообщения и разблокирован до ожидания. Эта блокировка должна быть приобретена до complete_all() и выпущена после, но задается вопросом, есть ли более чистый/лучший способ. Любые идеи приветствуются.Завершение объекта состояние гонки

Более контекст:Задача A инициализирует объект завершения, посылает запрос на задачи B вместе с адресом объекта завершения, а затем ожидает завершения. Задача B выполняет некоторую обработку при получении сообщения, а затем делает complete_all() на объекте завершения.

+1

Ядро уже обрабатывает этот случай afair. –

ответ

2

Если complete() или complete_all() вызывается до wait_for_completion() для конкретного объекта завершения, то wait_for_completion() немедленно вернется. Объект завершения примерно как семафор:

  • Внутренне, объект завершения имеет done счетчик, который не инициализируется в 0.

  • wait_for_completion() спит до done > 0 (или протекает немедленно, если done уже больше 0) и атомарно уменьшает done перед возвратом.

  • complete() прирост done и просыпается первый процесс, сон в wait_for_completion().

  • complete_all() наборы done к UINT_MAX/2 (фактически бесконечность) и просыпается каждый спит в wait_for_completion().

Так что, если я правильно понимаю ваш вопрос, нет необходимости в дополнительной блокировке; внутренний спиральный блок wait.lock объекта завершения уже синхронизирует доступ счетчика, так что случай, о котором вы беспокоитесь, обрабатывается правильно.

Смежные вопросы