0

我想用一个事件向多个线程发出信号,最好的方法是什么?例如:只要 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);

这些方法中哪种方法最好?就更好的软件设计而言,有没有第三种方法可以解决这个问题?还是我担心太多?

请给我一些建议。

4

2 回答 2

1

事件标志是一个非常基本的概念,并不适合通知多个线程(例如您的第一个示例)。

您的第二个示例是正确的方法,您希望每个要更新的线程都有一个标志。

如果您的应用程序需要进一步解耦,那么您可能希望转移到某种形式的发布/订阅模型,其中线程可以显式订阅他们感兴趣的消息,而 RTC 线程将发布消息。

于 2021-04-27T16:57:04.890 回答
0

瑞恩是正确的。您还可以在一个组中拥有多个标志,即您不需要像在第二个示例中那样创建 2 个组。

于 2021-04-27T17:44:06.177 回答