std::this_thread::sleep_for 用法與範例

本篇介紹 C++ 的 std::this_thread::sleep_for 暫停/停止/延遲當前執行緒的用法教學,std::this_thread::sleep_for 的作用是阻塞當前執行緒的執行,直到給定的這段延遲時間過去,其他執行緒並不受影響依舊執行,在文章後面會提供一些入門常用的 std::this_thread::sleep_for 範例程式碼。

自從 C++11 出來後,真是造就跨平台程式的一大福音呀!在這之前 Windows 要用 Sleep,Unix-like 要用 sleep / usleep,跨平台可能使用 define 區隔,哪個平台要用對應的 api,或使用 boost 提供的,現在只要編譯器支援 C++11,就可以輕鬆的用 C++11 的 sleep_for 來完成這件事,且這個程式要換個平台編譯只需要確定該平台編譯器的版本有支援,就免改程式碼就可以無痛移植了。早期 C++11 剛出來時編譯器都未支援,當時還沒這麽普及,不過現在基本上幾乎都支援了。

需要引入的標頭檔<thread>,另外通常也會順便引入<chrono>,因為很常會使用到 chrono 相關的函式,

範例1. 各種不同時間單位的 sleep 範例

以下範例展示了各種不同時間單位的 sleep 範例,有秒(seconds)、毫秒(milliseconds)、微秒(microseconds)、納秒(nanoseconds)共四種,根據不同種情形使用不同時間單位。

1
2
3
4
std::this_thread::sleep_for(std::chrono::seconds(5)); // sleep 5 秒(seconds)
std::this_thread::sleep_for(std::chrono::milliseconds(5)); // sleep 5 毫秒(milliseconds)
std::this_thread::sleep_for(std::chrono::microseconds(5)); // sleep 5 微秒(microseconds)
std::this_thread::sleep_for(std::chrono::nanoseconds(5)); // sleep 5 納秒(nanoseconds)


範例2. 量測/驗證 sleep 到底 sleep 多久

以下範例使用高精準的 high_resolution_clock 來去量測 sleep 2秒究竟有沒有到2秒,這方法也可以拿去量其他程式所執行的時間。

std-this_thread-sleep_for.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ std-this_thread-sleep_for.cpp -o a.out -std=c++11 -pthread
#include <iostream>
#include <thread>
#include <chrono>

int main() {
auto t1 = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2));
auto t2 = std::chrono::high_resolution_clock::now();

std::chrono::duration<double, std::milli> elapsed = t2 - t1;
std::cout << "Waited " << elapsed.count() << " ms\n";

return 0;
}

在我的 Ubuntu 上的結果輸出為:

1
Waited 2000.07 ms


參考
[1] std::this_thread::sleep_for - cppreference.com
https://en.cppreference.com/w/cpp/thread/sleep_for
[2] sleep_for - C++ Reference
http://www.cplusplus.com/reference/thread/this_thread/sleep_for/
[3] std::this_thread::sleep_for 与std::this_thread::yield的区别
https://blog.csdn.net/Sandy_WYM_/article/details/83538635


相關文章
C/C++ 新手入門教學懶人包
std::thread 用法與範例
std::mutex 怎麼實作的?
std::condition_variable 用法與範例