【问题标题】:How to sleep a C++ Boost Thread如何让 C++ Boost 线程休眠
【发布时间】:2011-05-14 23:58:09
【问题描述】:

似乎不可能使用 boost::thread 来休眠线程。 方法 sleep 需要一个 system_time 但我该如何构建它?

查看库并没有太大帮助...

基本上我有一个线程 在我作为入口点传递给这个线程的函数内部,我想调用类似

 boost::this_thread::sleep

什么的,怎么办?

谢谢

【问题讨论】:

    标签: c++ multithreading boost sleep


    【解决方案1】:

    取决于您的 Boost 版本:

    要么...

    #include <boost/chrono.hpp>
    #include <boost/thread/thread.hpp> 
    
    boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
    

    或者……

    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <boost/thread/thread.hpp> 
    
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    

    你也可以使用微秒、秒、分钟、小时,也许还有其他一些,我不确定。

    【讨论】:

    • 好的,谢谢...
    • 这给了我以下错误(使用 Xcode 5 / LLVM):错误:从 'boost::posix_time::microseconds' 没有可行的转换(又名 'subsecond_duration<:posix_time::time_duration>')到'const system_time'(又名'const boost::posix_time::ptime')
    • 使用boost::this_thread::sleep_for而不是boost::this_thread::sleep,后者已被弃用,见boost::this_thread::sleep
    【解决方案2】:

    从另一篇文章中,我了解到 boost::this_thread::sleep 已被 Boost v1.5.3 弃用:http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

    相反,试试

    void sleep_for(const chrono::duration<Rep, Period>& rel_time);
    

    例如

    boost::this_thread::sleep_for(boost::chrono::seconds(60));
    

    或者试试

    void sleep_until(const chrono::time_point<Clock, Duration>& abs_time);
    

    我使用 Boost v1.53 和已弃用的 sleep 函数,它不定期地使程序崩溃。当我将对sleep 函数的调用更改为对sleep_for 函数的调用时,程序停止崩溃。

    【讨论】:

      【解决方案3】:

      首先

      boost::posix_time::seconds secTime(1);  
      boost::this_thread::sleep(secTime); 
      

      其次

      boost::this_thread::sleep(boost::posix_time::milliseconds(100));
      

      【讨论】:

        【解决方案4】:

        我了解到,至少在 MS Visual Studio(2013 年和 2015 年尝试)中,两者之间存在巨大差异

        boost::this_thread::sleep(boost::posix_time::microseconds(SmallIterval));
        

        boost::this_thread::sleep_for(boost::chrono::microseconds(SmallIterval));
        or
        std::this_thread::sleep_for(std::chrono::microseconds(SmallIterval));
        

        当间隔小于某个相当大的阈值时(我看到阈值为 15000 微秒 = 15 毫秒)。

        如果 SmallIterval 很小,sleep() 会立即中断。 sleep(100 mks) 的行为与 sleep(0 mks) 一样。

        但是对于小于阈值的时间间隔的 sleep_for() 会暂停整个阈值。 sleep_for(100 mks) 的行为与 sleep_for(15000 mks) 一样。

        大于阈值的间隔和值 0 的行为是相同的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          • 2021-12-21
          • 2014-04-11
          • 1970-01-01
          • 1970-01-01
          • 2012-08-10
          相关资源
          最近更新 更多