我有两个相互通信的线程。线程B始终向线程A发送一条消息,并等待直到线程A处理完该消息,并使用伪代码:
// this is thread B
for(;;) {
post_msg_to_thread_A();
wait_for_msg_from_thread_A();
}
// this is called on thread A
void on_msg_from_thread_B() {
// ...do something...
post_msg_to_thread_B();
}
// this is called on thread A
void on_button_click() {
// is thread B waiting and will not wake up before on_button_click() exits?
}
编辑:现在,我遇到以下问题:在on_button_click()
中,我需要确定线程B当前是否正在等待线程A的回复消息,并且由于线程A尚未运行on_msg_from_thread_B()
。
换句话说,有些代码只能在线程B处于等待状态时才能在线程A上运行,并且我想知道在on_button_click()
中运行该代码是否安全。
为澄清起见,线程A运行一个主循环,该循环将处理其收到的不同消息。这些既可以是来自线程B的消息,也可以是诸如按钮单击之类的UI消息。
我认为我需要设置一个受互斥保护的标志来实现我想要的功能,但是进一步思考确实使我很困惑,我不确定这是否真的是可行的方法,因为我对它的想法越多这个问题变得更加复杂,到目前为止,我所有的互斥锁想法都陷入了僵局。
所以即使这可能是一个相当简单的多线程问题,我也没有解决的方法,所以我希望这里的人有个主意...
答案 0 :(得分:1)
换句话说,有些代码只能在线程A上运行 当线程B处于等待状态时,我想知道是否安全 在on_button_click()中运行该代码。
好的,也许您想做这样的事情,然后:
mutex the_shared_mutex;
// this is thread B
void thread_b()
{
lock_mutex(the_shared_mutex);
for(;;) {
post_msg_to_thread_A();
unlock_mutex(the_shared_mutex);
wait_for_msg_from_thread_A();
lock_mutex(the_shared_mutex);
}
}
// this is called on thread A
void on_button_click() {
lock_mutex(the_shared_mutex);
run_the_code_that_is_only_safe_to_run_when_b_is_in_waiting_state();
unlock_mutex(the_shared_mutex);
}
答案 1 :(得分:0)
我看不到伪代码在哪里出了问题。 我可以通过两种方式理解您的问题,并将尝试以两种方式回答。
一个选项是,即使尚未发送对线程B的响应,也需要处理对线程A的每个按钮单击。如果是这样,请为按钮B排队或单击按钮计数器。 假设您单击了按钮,但从未发送过回复。您可以将按钮单击事件添加到队列中或增加按钮单击计数器,然后在发送响应时从队列中弹出一个按钮单击事件或减少计数器。
如果您不希望通过按钮进行任何操作,如果还没有发送响应,则只需单击一个标记,以表示是否发送了响应。 如果您单击按钮并且标志为假,那么您什么也不做,继续运行。如果收到按钮单击并且标记为true,则处理该按钮单击并将标记变为false。发送响应后,将标记设置为true。
由于您没有从线程A和B访问相同的数据,因此在这里我不需要任何互斥锁。它们之间的所有通信可能都是某种IPC类型。