《C++并发在行动》中的可中断线程示例

Interruptible thread example in 《C++ Concurrency In Action》

本文关键字:中断 线程 C++并发在行动 并发      更新时间:2023-10-16

《C++ Concurrency In Action》在Chapter 9.2 Interrupting thread中实现了可中断线程。 Listing 9.10如下:

void interruptible_wait(std::condition_variable& cv,
                        std::unique_lock<std::mutex>& lk)
{
    interruption_point();
    this_thread_interrupt_flag.set_condition_variable(cv);
    cv.wait(lk);
    this_thread_interrupt_flag.clear_condition_variable();
    interruption_point();
}

根据书中的说法,这个函数引入了以下问题:

如果线程在最初调用 interruption_point() 之后但在调用 wait() 之前中断,则条件变量是否已与中断标志相关联并不重要,因为线程没有等待,因此无法通过条件变量上的通知唤醒。您需要确保在上次检查中断和调用 wait() 之间无法通知线程。

第一个问题是我们为什么need to ensure that?'因为这个函数似乎即使在the thread is interrupted after the initial call to interruption_point() and before the call to wait()也能正常运行。谁能告诉我这个功能将如何向南发展?是因为在这种情况下 cv.wait(lk) 永远不会收到通知吗?

第二个问题是Listing 9.11如何解决这个问题,仅仅用cv.wait_for()代替cv.wait()

void interruptible_wait(std::condition_variable& cv,
                        std::unique_lock<std::mutex>& lk)
{
    interruption_point();
    this_thread_interrupt_flag.set_condition_variable(cv);
    interrupt_flag::clear_cv_on_destruct guard;
    interruption_point();
    cv.wait_for(lk,std::chrono::milliseconds(1));
    interruption_point();
}
  1. 如果另一个线程在此线程到达wait()之前调用notify(),则此线程将不会收到该通知,并将永远等待另一个线程。

  2. wait_for不会永远等待。