1 操作系统自带的Sleep函数

1.1 Windows系统

在Windows系统中可以使用系统自带的Sleep()函数,需要包含Windows.h头文件

#include <iostream>
#include <windows.h>

int main()
{
    std::cout << "睡眠一秒" << std::endl;

    Sleep(1000);    // 系统睡眠函数

    std::cout << "一秒时间已过" << std::endl;

    return 0;
}

1.2 Unix环境的操作系统

1.2.1 sleep()函数

同样的在Unix环境下的操作系统也有系统自带的睡眠函数sleep(),同样休眠指定秒数,需要包含<unistd.h>头文件。

#include <iostream>
#include <unistd.h>

int main()
{
    std::cout << "Sleeping for 1 second.." << std::endl;

    sleep(1);    // sleep for 1 second

    std::cout << "1 second elapsed.." << std::endl;

    return 0;
}

1.2.2 usleep()函数

<unistd.h>中还提供了睡眠微秒的函数usleep()

#include <iostream>
#include <unistd.h>

int main()
{
    std::cout << "Sleeping for 1 second.." << std::endl;

    usleep(1000000);    // sleep for 1 second

    std::cout << "1 second elapsed.." << std::endl;

    return 0;
}

1.2.3 nanosleep

<unistd.h>中还提供了睡眠纳秒的函数nanosleep()

#include <iostream>
#include <unistd.h>

int main()
{
    std::cout << "Sleeping for 1 second.." << std::endl;

    nanosleep(1000000);    // sleep for 1 second

    std::cout << "1 second elapsed.." << std::endl;

    return 0;
}

2 C++ std标准库中的Sleep函数

2.1 std::this_thread::sleep_for

从C++11开始,我们可以使用std::this_thread::sleep_for函数在指定时间内睡眠当前线程。可是使用以下时间单位:

  • std::chrono::hours - 小时
  • std::chrono::minutes - 分钟
  • std::chrono::seconds - 秒
  • std::chrono::milliseconds - 毫秒
  • std::chrono::microseconds - 微秒
  • std::chrono::nanoseconds - 纳秒

而在C++20的标准中引入了更多的时间单位

  • std::chrono::years - 年
  • std::chrono::months - 月
  • std::chrono::weeks - 周
  • std::chrono::days - 日

在C++11中使用std::this_thread::sleep_for函数

#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    std::cout << "睡眠一秒" << std::endl;

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));    // 系统睡眠函数

    std::cout << "一秒时间已过" << std::endl;

    return 0;
}

在C++14中使用std::this_thread::sleep_for函数

在C++14中我们还可以通过文字后缀,如ns、us、ms、s、h等进一步简化代码,但是需要使用到std::chrono_literals命名空间。

#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    std::cout << "睡眠一秒" << std::endl;

    using namespace std::chrono_literals;    // 系统睡眠函数
    std::this_thread::sleep_for(1s);

    std::cout << "一秒时间已过" << std::endl;

    return 0;
}

2.2 std::this_thread::sleep_until

C++11除了提供std::this_thread::sleep_for睡眠固定时间之外,还提供了std::this_thread::sleep_until函数对程序进行睡眠,直到到某一个时间才唤醒程序。

在C++11中使用std::this_thread::sleep_until函数

下面的示例程序显示了C++11标准如何使用std::this_thread::sleep_until函数睡眠1秒钟。

#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    std::cout << "睡眠一秒" << std::endl;

    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));

    std::cout << "一秒时间已过" << std::endl;

    return 0;
}

在C++14中使用std::this_thread::sleep_until函数

同样的,C++14之后,我们也可以使用文字后缀指定时间单位

#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    std::cout << "睡眠一秒" << std::endl;

    using namespace std::chrono_literals;
    std::this_thread::sleep_until(std::chrono::system_clock::now() + 1s);

    std::cout << "一秒时间已过" << std::endl;

    return 0;
}