【问题标题】:Interruptible thread example in 《C++ Concurrency In Action》《C++ Concurrency In Action》中的可中断线程示例
【发布时间】:2016-02-24 19:28:58
【问题描述】:

《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();
}

按照书上的说法,这个函数引入了以下问题:

如果线程在初始调用 interrupt_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()替换为cv.wait_for()

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();
}

【问题讨论】:

  • 爱你的括号:*

标签: c++ multithreading interrupt


【解决方案1】:
  1. 如果其他线程在此线程到达wait() 之前调用notify(),则此线程将不会收到该通知,并且将永远等待另一个通知。

  2. wait_for 不会永远等待。

【讨论】:

  • 谢谢。我是不是误解了书中ensure这个词?是“理解”而不是“保证”的意思吗?
  • @StephenW 不,在这种情况下,它的意思是“保证”。不过,措辞有点奇怪……更好的措辞是“您需要确保在最后一次中断检查和调用wait()之间不会发生预期的通知”。
  • 好吧,那我们为什么需要确保呢?如果其他线程在此线程到达wait() 之前调用notify_all()notify_one(),我认为在最后一次检查中断和调用wait()。对此,似乎没有我们必须做/确保的事情。我们只需要按照您的建议使用wait_for() 替换wait()
  • @StephenW 是否也意味着:您需要确保在第一次检查中断和调用 wait() 之间发生预期的通知
猜你喜欢
  • 2016-02-19
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多