首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“C++并发操作”中的可中断线程示例

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

Stack Overflow用户
提问于 2016-02-24 11:25:24
回答 1查看 1.3K关注 0票数 1

“C++并发操作”在Chapter 9.2 Interrupting thread中实现了一个可中断的线程。Listing 9.10如下所示:

代码语言:javascript
复制
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()

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-24 11:28:58

  1. 如果其他线程在该线程到达notify()之前调用wait(),则该线程将不会收到该通知,并且将永远等待另一个通知。
  2. wait_for不会永远等下去。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35600851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档