Azure RTOS, как сигнализировать о нескольких потоках с помощью одного события?

Я хочу сигнализировать нескольким потокам одним событием, как лучше всего это сделать? Например: каждый раз, когда проходит 1 секунда, происходит прерывание RTC и устанавливается соответствующий флаг события, после чего любой поток, ожидающий этого события, запускается и выполняет свою работу.

      RTC interrupt:    
    tx_event_flags_set (&rtc_events, 1_SEC_PASS, TX_OR);

1st Thread: 
    tx_event_flags_get (&rtc_events, 1_SEC_PASS, TX_OR_CLEAR, &flag_val, TX_WAIT_FOREVER);

2nd Thread: 
    tx_event_flags_get (&rtc_events, 1_SEC_PASS, TX_OR_CLEAR, &flag_val, TX_WAIT_FOREVER);

Если я использую это так, только один из потоков будет уведомлен. Я могу использовать несколько флагов событий для одного и того же события RTC, но на этот раз RTC будет зависеть от потоков, и это будет плохо с точки зрения слабой связи.

      RTC interrupt:    
    tx_event_flags_set (&first_thread_events, 1_SEC_PASS, TX_OR);
    tx_event_flags_set (&second_thread_events, 1_SEC_PASS, TX_OR);

1st Thread: 
    tx_event_flags_get (&first_thread_events, 1_SEC_PASS, TX_OR_CLEAR, &flag_val, TX_WAIT_FOREVER);

2nd Thread: 
    tx_event_flags_get (&second_thread_events, 1_SEC_PASS, TX_OR_CLEAR, &flag_val, TX_WAIT_FOREVER);

Какой из этих методов подойдет лучше всего? Есть ли третий способ решить эту проблему с точки зрения разработки программного обеспечения? Или я слишком волнуюсь?

Пожалуйста, дайте мне совет.

2 ответа

Флаги событий представляют собой довольно простую концепцию и не совсем подходят для уведомления нескольких потоков (например, в вашем первом примере).

Ваш второй пример - правильный путь, вам нужен флаг для каждого потока, который нужно обновить.

Если ваше приложение требует дальнейшего разделения, вы, вероятно, захотите перейти к какой-либо форме модели публикации / подписки, где потоки могут явно подписываться на интересующие их сообщения, а поток RTC будет публиковать сообщение.

Райан прав. Вы также можете иметь несколько флагов в одной группе, т.е. вам не нужно создавать 2 группы, как во втором примере.

Другие вопросы по тегам