【问题标题】:How to interrupt boost::this_thread in c++如何在 C++ 中中断 boost::this_thread
【发布时间】:2015-05-29 11:43:37
【问题描述】:

在我的应用程序中,我设置了 10 秒的睡眠时间。我使用 boost::this_thread::sleep 函数给了睡眠。 有没有办法中断 boost::this_thread::sleep 函数?

【问题讨论】:

  • @WouterHuysentruit,你应该回答有趣吗?

标签: c++ boost-thread


【解决方案1】:

来自sleep() reference:

投掷: boost::thread_interrupted 如果当前执行线程被中断。

注意事项: sleep() 是预定义的interruption points 之一。

所以你需要在你的线程中做的是把sleep() 调用放在try-catch 中,然后捕获boost::thread_interrupted。然后在线程对象上调用interrupt()来中断睡眠。


顺便说一句,同样来自sleep reference:

警告

自 3.0.0 起已弃用。

请改用sleep_for() 和sleep_until()。

【讨论】:

  • 嘿@Joachim Pileborg 我正在使用来自“boost::this_thread”的睡眠功能,它没有中断API,我的要求是使用“boost::this_thread”,所以有什么方法可以中断睡眠。
  • @user3721279 boost::this_thread::sleep 正如我在回答中的链接中引用的那样,是一个中断点。请阅读我的回答中提供的链接。
【解决方案2】:

您可以使用interrupt() 中断sleep 函数。

你必须为你的线程开启中断,当它休眠时,你可以使用中断功能。

Boost 在网上有一个非常好的简短教程,请看这里:http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.interruption

【讨论】:

    【解决方案3】:

    我已经使用 boost::this_thread::sleep 函数给睡眠了。有没有办法中断 boost::this_thread::sleep 函数?

    不是这样,但实现起来并不难,就boost::this_thread::sleep而言:

    void sleep_for(boost::posix_time::milliseconds interval, std::atomic<bool>& interrupted)
    {
        static const auto resolution = boost::posix_time::milliseconds(10));
        ptime end_time(microsec_clock::local_time()) + interval;
    
        while( !interrupted.load() )
        {
            boost::this_thread::sleep(resolution);
            if(microsec_clock::local_time() > end_time)
                break;
        }
    }
    

    客户端代码线程1:

    std::atomic<bool>& interrupt = false;
    
    void f() {
        sleep_for(boost::posix_time::milliseconds(200), interrupt);
    }
    

    客户端代码线程2:

    interrupt.store(true); /// will cause thread 1 to be interrupted, if called
                           /// during execution of sleep_for.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多