C++ 中的睡眠函数

Posted

技术标签:

【中文标题】C++ 中的睡眠函数【英文标题】:Sleep function in C++ 【发布时间】:2010-12-12 02:49:36 【问题描述】:

是否有类似Sleep(time); 的函数可以将程序暂停 X 毫秒,但在 C++ 中?

我应该添加哪个标头以及函数的签名是什么?

【问题讨论】:

这能回答你的问题吗? Sleep for milliseconds 【参考方案1】:

对于 Windows:

#include "windows.h" 
Sleep(10);

对于 Unix:

#include <unistd.h>
usleep(10)

【讨论】:

【参考方案2】:

在 C++11 之前,没有可移植的方式来做到这一点。

一种可移植的方式是使用 Boost 或 Ace 库。 ACE 中有ACE_OS::sleep();

【讨论】:

... 并且(假定)在标准中没有可移植的方法的原因是因为时钟的精度(最小时间单位)取决于硬件或操作系统。不,我也不认为这是一个令人信服的理由,但我们就是这样。 标准中没有定义线程这样的东西......你想要睡觉。睡眠是操作系统提供的功能。我可以拥有不提供此类功能的环境。 @wilhelmtell:这根本不是原因。除了你自己,还有谁在做这个假设?没有线程支持的标准(是的),如果没有线程(或者只有一个线程),则不需要线程睡眠而不是简单的“忙等待”,可以用 你可以编辑你的答案,因为现在有一种便携的方法可以做到这一点。 这是堆栈溢出,没有人会修改他们的答案,因为他们已经过时了。【参考方案3】:

在 Unix 上,包括 #include &lt;unistd.h&gt;

您感兴趣的电话是usleep()。这需要微秒,因此您应该将毫秒值乘以 1000 并将结果传递给 usleep()

【讨论】:

【参考方案4】:

使用std::this_thread::sleep_for:

#include <chrono>
#include <thread>

std::chrono::milliseconds timespan(111605); // or whatever

std::this_thread::sleep_for(timespan);

还有互补的std::this_thread::sleep_until


在 C++11 之前,C++ 没有线程概念,也没有睡眠能力,因此您的解决方案必然依赖于平台。这是一个为 Windows 或 Unix 定义 sleep 函数的 sn-p:

#ifdef _WIN32
    #include <windows.h>

    void sleep(unsigned milliseconds)
    
        Sleep(milliseconds);
    
#else
    #include <unistd.h>
    
    void sleep(unsigned milliseconds)
    
        usleep(milliseconds * 1000); // takes microseconds
    
#endif

但是一个更简单的 pre-C++11 方法是使用boost::this_thread::sleep

【讨论】:

提示:this_thread::sleep_for 等正在使用单例,因此引入了 STB_GNU_UNIQUE,如果在共享库中使用它会阻止您的库卸载。【参考方案5】:

我为 C++ 11 找到的最简单的方法是:

您的包括:

#include <chrono>
#include <thread>

您的代码(这是睡眠 1000 毫秒的示例):

std::chrono::duration<int, std::milli> timespan(1000);
std::this_thread::sleep_for(timespan);

持续时间可以配置为以下任何一种:

std::chrono::nanoseconds   duration</*signed integer type of at least 64 bits*/, std::nano>
std::chrono::microseconds  duration</*signed integer type of at least 55 bits*/, std::micro>
std::chrono::milliseconds  duration</*signed integer type of at least 45 bits*/, std::milli>
std::chrono::seconds       duration</*signed integer type of at least 35 bits*/, std::ratio<1>>  
std::chrono::minutes       duration</*signed integer type of at least 29 bits*/, std::ratio<60>>
std::chrono::hours         duration</*signed integer type of at least 23 bits*/, std::ratio<3600>>

【讨论】:

【参考方案6】:

至少需要 C++11。

#include <thread>
#include <chrono>

...

std::this_thread::sleep_for(std::chrono::milliseconds(200));

【讨论】:

如果 C++ 委员会认为这是一种优雅、简洁的方式,他们真的很奇怪...... @shevy 如果你想更简洁,你可以使用std::chrono_literals,将函数参数减少为200ms【参考方案7】:

随便用吧……

首先包含unistd.h 头文件#include&lt;unistd.h&gt;,然后使用此函数将程序执行暂停所需的秒数:

sleep(x);

x 可以取任何以秒为单位的值。

如果你想暂停程序 5 秒是这样的:

sleep(5);

是正确的,我经常使用它。

适用于 C 和 C++。

【讨论】:

@L.F. usleep 需要几微秒,sleep(这个答案是用 来写的)需要几秒钟——所以答案是正确的,尽管不便携 @Human-Compiler 抱歉。在评论之前应该仔细检查。【参考方案8】:

最近我在学习 chrono 库,并想自己实现一个睡眠功能。这是代码,

#include <cmath>
#include <chrono>

template <typename rep = std::chrono::seconds::rep, 
          typename period = std::chrono::seconds::period>
void sleep(std::chrono::duration<rep, period> sec)

    using sleep_duration = std::chrono::duration<long double, std::nano>;

    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

    long double elapsed_time = 
    std::chrono::duration_cast<sleep_duration>(end - start).count();

    long double sleep_time = 
    std::chrono::duration_cast<sleep_duration>(sec).count();

    while (std::isgreater(sleep_time, elapsed_time)) 
        end = std::chrono::steady_clock::now();
        elapsed_time = std::chrono::duration_cast<sleep_duration>(end - start).count(); 
    

我们可以将它与任何std::chrono::duration 类型一起使用(默认情况下它以std::chrono::seconds 作为参数)。例如,

#include <cmath>
#include <chrono>

template <typename rep = std::chrono::seconds::rep, 
          typename period = std::chrono::seconds::period>
void sleep(std::chrono::duration<rep, period> sec)

    using sleep_duration = std::chrono::duration<long double, std::nano>;

    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

    long double elapsed_time = 
    std::chrono::duration_cast<sleep_duration>(end - start).count();

    long double sleep_time = 
    std::chrono::duration_cast<sleep_duration>(sec).count();

    while (std::isgreater(sleep_time, elapsed_time)) 
        end = std::chrono::steady_clock::now();
        elapsed_time = std::chrono::duration_cast<sleep_duration>(end - start).count(); 
    


using namespace std::chrono_literals;
int main (void) 
    std::chrono::steady_clock::time_point start1 = std::chrono::steady_clock::now();
    
    sleep(5s);  // sleep for 5 seconds
    
    std::chrono::steady_clock::time_point end1 = std::chrono::steady_clock::now();
    
    std::cout << std::setprecision(9) << std::fixed;
    std::cout << "Elapsed time was: " << std::chrono::duration_cast<std::chrono::seconds>(end1-start1).count() << "s\n";
    
    std::chrono::steady_clock::time_point start2 = std::chrono::steady_clock::now();

    sleep(500000ns);  // sleep for 500000 nano seconds/500 micro seconds
    // same as writing: sleep(500us)
    
    std::chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
    
    std::cout << "Elapsed time was: " << std::chrono::duration_cast<std::chrono::microseconds>(end2-start2).count() << "us\n";
    return 0;

欲了解更多信息,请访问https://en.cppreference.com/w/cpp/header/chrono 并查看Howard Hinnant、https://www.youtube.com/watch?v=P32hvk8b13M 的这个 cppcon 谈话。 他还有两次关于 chrono 库的演讲。而且你可以随时使用库函数std::this_thread::sleep_for

注意:输出可能不准确。所以,不要指望它给出确切的时间。

【讨论】:

【参考方案9】:

我喜欢@Ben Voigt 提出的解决方案——它不依赖于 C++ 之外的任何东西,但他没有提到使代码工作的重要细节。所以我放了完整的代码,请注意以 using 开头的行。

#include <thread>
#include <chrono>

...

using namespace std::chrono_literals;
std::this_thread::sleep_for(200ms);

【讨论】:

【参考方案10】:

对于一个简短的解决方案使用

#include <thread>

using namespace std;
using namespace std::this_thread;

void f() 
    sleep_for(200ms);

【讨论】:

以上是关于C++ 中的睡眠函数的主要内容,如果未能解决你的问题,请参考以下文章

C++睡眠延时函数 Sleep() usleep()(windows.hunistd.h)

linux内核中的睡眠函数*delay*sleep

linux内核中的睡眠函数*delay*sleep

Linux C++ 用户空间应用程序实时睡眠功能(POSIX、Raspberry Pi)

C++ 中是不是有通用睡眠和通用暂停命令?

Windows 是不是进入睡眠模式或使用 C++ 休眠? [复制]