У меня общий вопрос о межпоточном взаимодействии.
Сейчас я использую кучу потоков C ++ (~ 15).
Все они используют BusyWait (опрос) друг друга, чтобы получить данные для обработки. Но трудно поддерживать низкий уровень использования процессора и обеспечивать хорошую производительность и избегать слишком большого переключения контекста.
Итак, я смотрю на переменную условия и сигнал. Я думаю, что понимаю общую концепцию включения потока в .Wait (), ожидания другого потока, вызывающего .Signal ().
Вопрос № 1) Моя проблема может быть концептуальной, но если поток, ожидающий сигнала, получает SUSPENDED во время ожидания, он не может выполнить какое-либо действие самостоятельно. Можно ли как-нибудь дать ему проснуться для выполнения каких-либо действий?
Вопрос № 2) Кроме того, мой класс используется для передачи данных в обоих направлениях. Но если средний класс ожидает сигнала от другого класса, он не может отправить сигнал этому классу. Такие как:
_________ _________ __________
| Class A |---newData Signal--->| Class B |---newData Signal--->| Class C |
| | |(WAITING)|<---newData Signal---| |
--------- --------- ----------
Таким образом, если класс B включен .Wait () для .Signal () из C, он не может обработать новый сигнал от A.
Возможно ли, чтобы оба A && C посылали один и тот же сигнал "newData" B, чтобы разбудить его? Можно ли отличить сигнал от A && C.
Я кодирую это, используя C ++, используя инфраструктуру ACE, и могу переключиться на Boost. Но я думаю, что это достаточно универсально, чтобы я мог применить ответ к любой ОС (надеюсь).
Спасибо