Упорядоченное уведомление о потоках, ожидающих условия (C ++, boost)

0

Кто-нибудь знает класс переменных состояния, который позволяет уведомлять потоки, ожидающие уведомления о состоянии, в том порядке, в котором они начали ждать?

В настоящее время я использую класс boost condition_variable, но вызов condition_variable::notify_one() пробуждает случайный поток, а не поток, который сначала называется condition_variable::wait(). Я также попытался добавить идентификаторы потоков в очередь перед вызовом condition_variable::wait(), чтобы я мог вызвать condition_variable::notify_all() на котором все ожидающие потоки просыпаются, проверять очередь и либо ждать снова, либо продолжать (только один поток, а именно, поток сначала в очереди). Проблема в том, что вызов notify_all() дважды не гарантирует, что все потоки просыпаются дважды, тем самым теряя уведомления. Какие-либо предложения?

Теги:
multithreading
condition-variable

1 ответ

3
Лучший ответ

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

  • 0
    Да, это будет работать, я полагаю, но вы правы, это может быть проблемой дизайна. У меня есть один поток, который обрабатывает чтение / запись последовательного порта в цикле событий. Этот цикл также проверяет события записи, которые я сигнализирую себе из разных потоков. Эти потоки теперь ждут ответа, и первый ответ принадлежит потоку, который вызвал первое событие записи, отсюда и упорядоченная сигнализация, о которой я просил.
  • 0
    Ваш общий дизайн borken, как описано @Slava

Ещё вопросы

Сообщество Overcoder
Наверх
Меню