引言
當討論現(xiàn)代編程語言的特性時,C++11無疑是一個不容忽視的里程碑。在前一篇文章中,我們深入探討了Lambda表達式在C++11中的引入和應(yīng)用。本文將繼續(xù)探索C++11的強大功能,具體而言,我們這篇文章將聚焦于線程庫和其中的thread類。
線程在多任務(wù)處理中起著至關(guān)重要的作用,它們允許程序同時執(zhí)行多個任務(wù),從而提高效率和響應(yīng)速度。在C++11之前,線程的處理相對復雜且容易出錯。然而,在C++11中引入的thread類為我們帶來了更加便捷和安全的線程管理方式。讓我們一起深入研究C++11線程庫中的thread類,探索多線程編程的無限潛力吧!
一、thread類的簡單介紹
thread的官方文檔
thread類是C++11引入的一個重要特性,它位于<thread>頭文件中,并提供了一種簡單而強大的方式來實現(xiàn)多線程編程。
使用thread類,我們可以輕松地創(chuàng)建和管理線程。通過創(chuàng)建thread對象,我們可以指定要執(zhí)行的線程函數(shù),并傳遞所需的參數(shù)。一旦線程對象被創(chuàng)建,我們可以使用它的成員函數(shù)來控制線程的生命周期,如啟動線程、等待線程完成、檢查線程是否運行等。
?以下是thread類的一些常用成員函數(shù):
函數(shù)名 | 功能 |
---|---|
構(gòu)造函數(shù) | 用于創(chuàng)建線程對象,并指定要執(zhí)行的函數(shù)或可調(diào)用對象。 |
start() | 啟動線程的執(zhí)行,使線程進入就緒狀態(tài)并開始運行。 |
join() | 阻塞當前線程,直到被調(diào)用的線程執(zhí)行完畢。通常用于等待線程的結(jié)束,并獲取線程的返回值(如果有)。 |
detach() | 將線程對象設(shè)置為分離狀態(tài),使得線程無法被其他線程join(),并在執(zhí)行完畢后自動釋放資源。 |
get_id() | 返回線程的ID,用于唯一標識一個線程。 |
joinable() | 查詢線程是否可執(zhí)行,即查詢線程是否已經(jīng)啟動但未被join()。 |
hardware_concurrency() | 返回當前系統(tǒng)支持的最大線程數(shù),通常與CPU核心數(shù)相同。 |
??注意:以上僅列舉了thread類的部分常用成員函數(shù),還有其他一些成員函數(shù)和靜態(tài)成員函數(shù)可供我們使用。同時,在使用這些成員函數(shù)時,我們需要注意線程安全性和同步機制,以避免出現(xiàn)競態(tài)條件和數(shù)據(jù)不一致的問題。
二、線程函數(shù)詳細介紹
1. start() 函數(shù)
start()函數(shù)通常是由線程對象調(diào)用的,用于開始執(zhí)行一個新線程。
(1)頭文件
start()函數(shù)在C++標準庫的<thread>頭文件中進行聲明。
(2)函數(shù)原型
start()函數(shù)的函數(shù)原型如下:
void start();
2. join() 函數(shù)
在C++標準庫中,std::thread類提供了join()函數(shù)用于等待一個線程的結(jié)束并回收資源。
(1)頭文件
join()函數(shù)在C++標準庫的<thread>頭文件中進行聲明。
(2)函數(shù)原型
join()函數(shù)的函數(shù)原型如下:
void join();
3. detach() 函數(shù)
detach()函數(shù)是std::thread類提供的一個成員函數(shù),用于將線程與std::thread對象分離,使其成為一個獨立的線程,并在后臺運行。
(1)頭文件
detach()函數(shù)在C++標準庫的<thread>頭文件中進行聲明。
(2)函數(shù)原型
detach()函數(shù)的函數(shù)原型如下:
void detach();
(3)使用示例
下面是一個使用std::thread及其detach()函數(shù)的示例:
#include <iostream>
#include <thread>
void thread_func()
{
std::cout << "Hello from new thread!" << std::endl;
}
int main()
{
std::thread t(thread_func); // 創(chuàng)建一個新線程,并指定線程函數(shù)
t.detach(); // 分離新線程
std::cout << "Hello from main thread!" << std::endl;
return 0;
}
在上述示例中,我們首先創(chuàng)建一個std::thread對象t,并將一個線程函數(shù)thread_func作為參數(shù)傳遞給構(gòu)造函數(shù)。然后,我們通過調(diào)用t.detach()函數(shù)將新線程與std::thread對象分離。最后,主線程輸出“Hello from main thread!”。
在運行上述示例時,將會看到如下輸出:
Hello from main thread!
Hello from new thread!
由于我們在主線程中調(diào)用了t.detach()函數(shù),新線程成為一個獨立的線程,并在后臺運行。因此,在輸出“Hello from main thread!”之后,新線程才會輸出“Hello from new thread!”。
4. get_id() 函數(shù)
get_id()函數(shù)是std::thread類提供的一個成員函數(shù),用于獲取與std::thread對象相關(guān)聯(lián)的線程的ID。
(1)頭文件
get_id()函數(shù)在C++標準庫的<thread>頭文件中進行聲明。
(2)函數(shù)原型
get_id()函數(shù)的函數(shù)原型如下:
std::thread::id get_id() const noexcept;
(3)使用示例
下面是一個使用std::thread及其get_id()函數(shù)的示例:
#include <iostream>
#include <thread>
void thread_func()
{
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}
int main()
{
std::thread t(thread_func); // 創(chuàng)建一個新線程,并指定線程函數(shù)
std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;
t.join(); // 等待新線程結(jié)束
return 0;
}
在上述示例中,我們首先創(chuàng)建一個std::thread對象t,并將一個線程函數(shù)thread_func作為參數(shù)傳遞給構(gòu)造函數(shù)。然后,我們通過調(diào)用t.join()函數(shù)等待新線程結(jié)束。在新線程的線程函數(shù)中,我們輸出線程的ID。在主線程中,我們也輸出主線程的ID。
在運行上述示例時,將會看到如下輸出:
Main thread ID: 140102324408064
Thread ID: 140102234146560
由于我們在主線程中調(diào)用了std::this_thread::get_id()函數(shù)和新線程中的get_id()函數(shù),分別獲取了主線程和新線程的ID??梢钥吹剑瑑蓚€線程的ID是不同的。
5. joinable() 函數(shù)
joinable()函數(shù)是std::thread類提供的一個成員函數(shù),用于檢查與std::thread對象關(guān)聯(lián)的線程是否可以被join或detach。
(1)頭文件
joinable()函數(shù)在C++標準庫的<thread>頭文件中進行聲明。
(2)函數(shù)原型
joinable()函數(shù)的函數(shù)原型如下:
bool joinable() const noexcept;
(3)參數(shù)解釋
joinable()函數(shù)沒有參數(shù)。調(diào)用該函數(shù)時,將返回一個bool類型的值,表示與std::thread對象相關(guān)聯(lián)的線程是否可以被join或detach。
(4)返回值
joinable()函數(shù)返回值類型為bool。如果與std::thread對象相關(guān)聯(lián)的線程可以被join或detach,則返回true;否則返回false。
(5)使用示例
下面是一個使用std::thread及其joinable()函數(shù)的示例:
#include <iostream>
#include <thread>
void thread_func()
{
std::cout << "Hello from new thread!" << std::endl;
}
int main()
{
std::thread t(thread_func); // 創(chuàng)建一個新線程,并指定線程函數(shù)
std::cout << "Is thread joinable? " << t.joinable() << std::endl; // 輸出true
t.join(); // 等待新線程結(jié)束
std::cout << "Is thread joinable? " << t.joinable() << std::endl; // 輸出false
return 0;
}
在上述示例中,我們首先創(chuàng)建一個std::thread
對象t
,并將一個線程函數(shù)thread_func
作為參數(shù)傳遞給構(gòu)造函數(shù)。然后,我們通過調(diào)用t.joinable()
函數(shù)檢查與std::thread
對象關(guān)聯(lián)的線程是否可以被join
或detach
。在新線程結(jié)束之前,該函數(shù)返回true。在調(diào)用t.join()
函數(shù)等待新線程結(jié)束后,該函數(shù)返回false。
三、std::this_thread命名空間
C++11引入了std::this_thread命名空間,其中包含了一些與當前線程相關(guān)的函數(shù)和屬性。這些函數(shù)和屬性以全局函數(shù)或靜態(tài)成員函數(shù)的形式提供。
?以下是std::this_thread命名空間下的一些常用函數(shù):
函數(shù)名 | 功能 |
---|---|
std::this_thread::get_id() | 獲取當前線程的ID,返回一個std::thread::id對象。 |
std::this_thread::sleep_for() | 使當前線程休眠一段指定的時間。接受一個std::chrono::duration作為參數(shù),表示休眠的時間間隔。 |
std::this_thread::yield() | 暫時放棄當前線程的執(zhí)行,允許其他線程運行。調(diào)用yield()后,當前線程可能會被重新調(diào)度執(zhí)行,也可能繼續(xù)讓其他線程執(zhí)行。 |
??注意:這些函數(shù)是與當前線程直接相關(guān)的,而不是用于創(chuàng)建或管理線程的類。
溫馨提示
感謝您對博主文章的關(guān)注與支持!另外,我計劃在未來的更新中持續(xù)探討與本文相關(guān)的內(nèi)容,會為您帶來更多關(guān)于C++以及編程技術(shù)問題的深入解析、應(yīng)用案例和趣味玩法等。請繼續(xù)關(guān)注博主的更新,不要錯過任何精彩內(nèi)容!文章來源:http://www.zghlxwxcb.cn/news/detail-762674.html
再次感謝您的支持和關(guān)注。期待與您建立更緊密的互動,共同探索C++、算法和編程的奧秘。祝您生活愉快,排便順暢!文章來源地址http://www.zghlxwxcb.cn/news/detail-762674.html
到了這里,關(guān)于【C++入門到精通】 線程庫 | thread類 C++11 [ C++入門 ]的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!