翻譯來自:https://thispointer.com/how-to-put-a-thread-to-sleep-in-c11-sleep_for-sleep_until/
在本文中,我們將討論如何讓 c++11 線程休眠
c++11提供了2個讓線程休眠的函數,即
std::this_thread::sleep_for
std::this_thread::sleep_until
沉睡一段時間
C++11提供了一個函數std::this_thread::sleep_for來阻塞當前進程指定的持續時間即
template <class Rep, class Period> void sleep_for (const chrono::duration<Rep,Period>& rel_time);
此函數接受一個持續時間作為參數,並使調用線程在該特定持續時間內休眠。這個持續時間可以從納秒到幾小時,即
std::chrono::nanoseconds
std::chrono::microseconds
std::chrono::milliseconds
std::chrono::seconds
std::chrono::minutes
std::chrono::hours
讓我們看一些例子,
為 MilliSeconds 休眠一個線程:
要讓線程休眠 200 毫秒,請使用以下參數調用 sleep_for,即
std::this_thread::sleep_for(std::chrono::milliseconds(200));
使線程休眠幾分鍾:
要使線程休眠 1 分鍾,請使用以下參數調用 sleep_for,即
std::this_thread::sleep_for(std::chrono::minutes(1));
例子
#include <iostream> #include <thread> #include <chrono> void threadFunc() { int i = 0; while (i < 10) { // Print Thread ID and Counter i std::cout<<std::this_thread::get_id()<<" :: "<<i++<<std::endl; // Sleep this thread for 200 MilliSeconds std::this_thread::sleep_for(std::chrono::milliseconds(200)); } } int main() { std::thread th(&threadFunc); th.join(); return 0; }
輸出:
140484807997184 :: 0 140484807997184 :: 1 140484807997184 :: 2 140484807997184 :: 3 140484807997184 :: 4 140484807997184 :: 5 140484807997184 :: 6 140484807997184 :: 7 140484807997184 :: 8 140484807997184 :: 9
沉睡到某個時間點
很多時候我們希望線程休眠直到將來的某個時間點。這可以使用 sleep_untill() 來實現,即
template< class Clock, class Duration > void sleep_until( const std::chrono::time_point<Clock,Duration>& sleepTime );
它接受一個時間點作為參數並阻塞當前線程直到達到這個時間點。
查看完整的示例,在這里我們將讓線程休眠直到將來的某個時間點,即
#include <iostream> #include <thread> #include <chrono> // Print Current Time void print_time_point(std::chrono::system_clock::time_point timePoint) { std::time_t timeStamp = std::chrono::system_clock::to_time_t(timePoint); std::cout << std::ctime(&timeStamp) << std::endl; } void threadFunc() { std::cout<<"Current Time :: "; // Print Current Time print_time_point(std::chrono::system_clock::now()); // create a time point pointing to 10 second in future std::chrono::system_clock::time_point timePoint = std::chrono::system_clock::now() + std::chrono::seconds(10); std::cout << "Going to Sleep Until :: "; print_time_point(timePoint); // Sleep Till specified time point // Accepts std::chrono::system_clock::time_point as argument std::this_thread::sleep_until(timePoint); std::cout<<"Current Time :: "; // Print Current Time print_time_point(std::chrono::system_clock::now()); } int main() { std::thread th(&threadFunc); th.join(); return 0; }
輸出
Current Time :: Thu Nov 18 20:45:11 2021 Going to Sleep Until :: Thu Nov 18 20:45:21 2021 Current Time :: Thu Nov 18 20:45:21 2021