C++11——多線程編程12 如何讓線程在C++11中休眠


翻譯來自: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM