代码之家  ›  专栏  ›  技术社区  ›  Andreas

确保线程处于特定状态

  •  0
  • Andreas  · 技术社区  · 7 年前

    我有两个线程相互通信。线程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上运行一些代码,我想知道在其中运行这些代码是否安全 点击按钮

    我想我需要设置一个互斥保护标志来实现我想要的目标,但如果再进一步思考,我的头脑会变得混乱,我完全不确定这是否真的是一条路要走,因为我想得越多,这个问题就变得越复杂,到目前为止我所有的互斥思想都陷入了僵局。

    所以,即使这可能是一个相当简单的多线程问题,我不认为有办法解决它,所以我希望有人在这里有一个想法。。。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jeremy Friesner    7 年前

    当线程B处于等待状态时,我想知道 在“\u button\u 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);
     }
    
        2
  •  0
  •   Matan Peleg    7 年前

    我看不出你的伪代码有什么问题。 我可以从两个方面理解你的问题,并将尝试从两个方面回答。

    一个选项是,即使尚未发送对线程B的响应,您也需要处理线程A上的每个按钮单击。如果是这样的话,就给线程B创建一个按钮点击的队列或计数器。 假设你得到一个按钮点击,从来没有发送过回应。将button click事件添加到队列或递增button click计数器,当发送响应时,从队列中弹出一个button click事件或递减计数器。

    如果你不想做任何事,一个按钮点击,如果你还没有发送一个响应,那么你所需要的只是一个标志,代表你是否发送了一个响应尚未。 如果您收到一个按钮点击和标志是假的,那么你什么也不做,继续运行。如果您收到一个按钮点击并且标志为true,那么您将处理该按钮点击并将标志变为false。在发送响应时,您将标志转换为true。

    我认为这里不需要互斥,因为您不能从线程a和线程B访问相同的数据。它们之间的所有通信可能都是某种类型的IPC。