确保线程处于特定状态

时间:2018-10-02 11:55:49

标签: multithreading

我有两个相互通信的线程。线程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消息。

我认为我需要设置一个受互斥保护的标志来实现我想要的功能,但是进一步思考确实使我很困惑,我不确定这是否真的是可行的方法,因为我对它的想法越多这个问题变得更加复杂,到目前为止,我所有的互斥锁想法都陷入了僵局。

所以即使这可能是一个相当简单的多线程问题,我也没有解决的方法,所以我希望这里的人有个主意...

2 个答案:

答案 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类型。