Синхронизация pthread C++ и многократное пробуждение для потока

вопрос о синхронизации потоков C++. Предположим, что у нас есть 2 потока: Thread1 и Thread2.

  • Thread1 занимается своей задачей и, в некоторых случаях, он должен уведомлять об обновлении состояния Thread2.

  • Thread2 занимается извлечением данных из синхронизированной очереди. Таким образом, Thread2 может спать, если очередь пуста.

Как я могу разбудить Thread2 при двух условиях:

  • Уведомление о новом сообщении в очереди;

    or

  • изменение статуса Thread1

практические примеры кода приветствуются


person Safari    schedule 08.06.2013    source источник
comment
Что вы кодировали до сих пор?   -  person alk    schedule 08.06.2013
comment
ничего, я разрабатываю архитектуру   -  person Safari    schedule 08.06.2013


Ответы (2)


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

person jop    schedule 08.06.2013
comment
хорошо, это может быть быстрым решением для достижения моей цели ... Но как вы достигаете того, что я описал в своем вопросе? - person Safari; 08.06.2013
comment
Я бы сказал, что именно так вы достигаете цели, которую описываете... Есть ли какие-либо дополнительные требования, делающие это решение непригодным? - person jop; 08.06.2013
comment
Нет .. Конечно, я воспользуюсь вашим предложением ... но мне было любопытно, как вы можете реализовать то, что описано в моем вопросе .. просто любопытно на будущее. - person Safari; 08.06.2013

Почему бы вам также не использовать ту же очередь (но другой код команды) для уведомления thread2? Thread2 просто ждет каких-либо данных в очереди в режиме блокировки, для каждого нового сообщения проверяет его на обновление статуса или данных и выполняет соответствующие действия.

person Community    schedule 08.06.2013
comment
хорошо, это может быть быстрым решением для достижения моей цели ... Но как вы достигаете того, что я описал в своем вопросе? - person Safari; 08.06.2013
comment
Вам нужно определить сообщения, которые получает thread2: кажется, вам нужны два типа сообщений. У вас может быть заголовок сообщения, чтобы определить тип сообщения. Thread2 сначала проверяет заголовок, а затем выполняет соответствующую обработку. - person Steven Ding; 08.06.2013