“C ++并发操作”中的可中断线程示例

时间:2016-02-24 11:25:24

标签: c++ multithreading interrupt

“C ++ Concurrency In Action”在function checkHostname(containerId, elementId) { var textContainer = document.getElementById(elementId); if(textContainer) { var texte = textContainer.value; } }中实现了一个可中断的线程。 Chapter 9.2 Interrupting thread如下:

Listing 9.10

根据这本书,这个功能引入了以下问题:

  

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

第一个问题是我们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(); } 的原因? &#39;导致此功能似乎正常运行need to ensure that。谁能告诉我这个功能将如何向南?是因为在这种情况下永远不会通知cv.wait(lk)吗?

第二个问题the thread is interrupted after the initial call to interruption_point() and before the call to wait()解决此问题的方式,本书仅通过Listing 9.11替换cv.wait()来提及:

cv.wait_for()

1 个答案:

答案 0 :(得分:2)

  1. 如果另一个线程在此线程到达notify()之前调用wait(),则该线程将无法接收该通知,并将永远等待另一个线程。

  2. wait_for不会永远等待。