std::thread是C++11標準庫中的一個多線程庫,提供了一種跨多個CPU核心並發執行代碼的方法。它具有簡單、靈活和高吞吐量等優點,使得它成為編寫多線程代碼的首選工具。在本篇文章中,我們將從以下方面詳細介紹std::thread的用法:
一、創建線程
要創建一個線程,只需使用std::thread的構造函數即可。std::thread的構造函數接受一個可調用對象,並將其作為新線程中運行的函數。以下是std::thread構造函數的示例:
#include #include void PrintHello() { std::cout << "Hello World!\n"; } int main() { // 創建線程並啟動 std::thread t(PrintHello); // 等待線程結束 t.join(); return 0; }
在上面的示例中,我們創建了一個名為t的線程,並將PrintHello函數作為可調用對象傳遞給std::thread構造函數。線程t啟動後,將運行PrintHello函數的代碼。在main函數的最後,我們等待線程t結束,然後退出程序。
二、傳遞參數
如果需要向線程傳遞參數,可以使用std::thread構造函數的參數列表,將參數傳遞給可調用對象。以下是std::thread傳遞參數的示例:
#include #include void PrintHello(std::string name) { std::cout << "Hello " << name << "!\n"; } int main() { // 創建線程並啟動 std::thread t(PrintHello, "Alice"); // 等待線程結束 t.join(); return 0; }
在上面的示例中,我們將一個字符串”Alice”作為參數傳遞給PrintHello函數,該參數被封裝在std::thread構造函數中。線程t啟動後,將運行PrintHello函數的代碼。在main函數的最後,我們等待線程t結束,然後退出程序。
三、獲取線程id
每個線程都有一個唯一的id,可以使用std::thread的成員函數get_id()獲取線程id。以下是std::thread獲取線程id的示例:
#include #include void PrintThreadId() { std::cout << "Thread ID: " << std::this_thread::get_id() << "\n"; } int main() { // 創建線程並啟動 std::thread t(PrintThreadId); // 等待線程結束 t.join(); return 0; }
在上面的示例中,我們定義了一個PrintThreadId函數,它將輸出當前線程的id。在main函數中,我們創建了一個名為t的線程,啟動了PrintThreadId函數。在PrintThreadId函數中,std::this_thread::get_id()函數返回當前線程的id,並將其輸出到控制台上。
四、線程休眠
有時候需要讓線程休眠一段時間,這可以使用std::this_thread::sleep_for()函數實現。該函數接受一個std::chrono::duration類型的參數,指定線程休眠的時間。以下是std::thread休眠的示例:
#include #include #include void PrintHello() { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Hello World!\n"; } int main() { // 創建線程並啟動 std::thread t(PrintHello); // 等待線程結束 t.join(); return 0; }
在上面的示例中,我們定義了一個PrintHello函數,並在函數中休眠了1秒鐘。在main函數中,我們創建了一個名為t的線程,啟動了PrintHello函數,該函數在休眠後將輸出“Hello World!”。
五、線程分離
在std::thread中,線程分離是指主線程和子線程在執行時互不干擾,它們相互獨立。如果創建的線程沒有被分離,那麼在main函數中需要使用t.join()等待線程結束後才能退出程序,否則程序會崩潰。為了避免這種情況,可以使用std::thread的成員函數detach()將線程分離。以下是std::thread線程分離的示例:
#include #include void PrintHello() { std::cout << "Hello World!\n"; } int main() { // 創建線程並啟動 std::thread t(PrintHello); // 分離線程 t.detach(); return 0; }
在上面的示例中,我們定義了一個PrintHello函數,並在main函數中創建了一個名為t的線程。在主線程中,我們使用t.detach()將線程t分離,使其獨立運行。在PrintHello函數中,它輸出了“Hello World!”,然後線程t結束。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/270874.html