《C++并发在行动》中的可中断线程示例
Interruptible thread example in 《C++ Concurrency In Action》
《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();
}
-
如果另一个线程在此线程到达
wait()
之前调用notify()
,则此线程将不会收到该通知,并将永远等待另一个线程。 -
wait_for
不会永远等待。
相关文章:
- 使用 shared_ptr 在中断时结束多线程循环
- 如何使用 SIGINT 在第二个线程中断 getchar
- 可中断线程类 C++11 - 遇到错误?
- 指向成员对象的指针 - 中断线程
- 处理中断时,如何回到主gui线程
- 在 Visual Studio 中的调试中断时设置默认线程,C++
- 返回可中断线程的函数
- 多线程应用程序中的零MQ处理中断
- C++等待用户输入的中断线程
- 如何中断Asynch线程
- 捕获升压线程中断和退出线程的正确方法
- 中断已处于条件变量等待调用中的提升线程
- 中断正在执行MKL或其他第三方函数的线程
- 为什么我不能中断这个特定的提升::线程?
- 《C++并发在行动》中的可中断线程示例
- 使用 Boost::thread 实现可中断线程
- 可以优化中断线程安全
- Windows API中的不可中断线程部分
- 在一定时间后中断线程,在等待时不阻塞
- 为什么此代码被认为是可重复的,以及当操作系统中断线程时究竟会发生什么