C++11std::thread的使用-創(chuàng)新互聯(lián)

std::thread
  • std::thread 構(gòu)造函數(shù)
  • std::thread 賦值操作
  • std::thread其他成員函數(shù)
    • `get_id`: 獲取線程 ID
    • `joinable`: 檢查線程是否可被 join
    • `detach`: Detach 線程
    • `join`: Detach 線程
    • `swap`: Swap 線程
    • `native_handle:` 返回 native handle
    • `hardware_concurrency` \[static]
  • std::this_thread 命名空間中相關(guān)輔助函數(shù)
  • std::thread的可聯(lián)結(jié)性
  • std::thread 對象析構(gòu)

員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團隊的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)建站堅持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因為“專注所以專業(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),小程序定制開發(fā),軟件按需策劃等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。std::thread 構(gòu)造函數(shù)
//默認(rèn)構(gòu)造函數(shù)  
thread() noexcept;
//初始化構(gòu)造函數(shù)  
templateexplicit thread(Fn&& fn, Args&&... args);
//拷貝構(gòu)造函數(shù) [deleted]  
thread(const thread&) = delete;
//Move 構(gòu)造函數(shù)  
thread(thread&& x) noexcept;

  • 默認(rèn)構(gòu)造函數(shù),創(chuàng)建一個空的std::thread執(zhí)行對象。
  • 初始化構(gòu)造函數(shù),創(chuàng)建一個std::thread對象,該std::thread對象可被joinable,新產(chǎn)生的線程會調(diào)用fn函數(shù),該函數(shù)的參數(shù)由args給出。
  • 拷貝構(gòu)造函數(shù)(被禁用),意味著std::thread對象不可拷貝構(gòu)造。
  • Move 構(gòu)造函數(shù),move 構(gòu)造函數(shù)(move 語義是 C++11 新出現(xiàn)的概念,詳見附錄),調(diào)用成功之后x不代表任何std::thread執(zhí)行對象。
  • 📌注意:可被joinablestd::thread對象必須在他們銷毀之前被主線程join或者將其設(shè)置為detached.

std::thread 賦值操作
//Move 賦值操作  
thread& operator=(thread&& rhs) noexcept;
//拷貝賦值操作 [deleted]  
thread& operator=(const thread&) = delete;

  • Move 賦值操作(1),如果當(dāng)前對象不可joinable,需要傳遞一個右值引用(rhs)給move賦值操作;如果當(dāng)前對象可被joinable,則會調(diào)用terminate() 報錯。
  • 拷貝賦值操作(2),被禁用,因此std::thread對象不可拷貝賦值。
  • 示例
#include#include#include// std::chrono::seconds
 #include// std::cout
 #include// std::thread, std::this_thread::sleep_for

 void thread_task(int n) { std::this_thread::sleep_for(std::chrono::seconds(n));
     std::cout<< "hello thread "<< std::this_thread::get_id()<< " paused "<< n<< " seconds"<< std::endl;
 }

 int main(int argc, const char *argv[])
 { std::thread threads[5];
     std::cout<< "Spawning 5 threads...\n";
     for (int i = 0; i< 5; i++) { threads[i] = std::thread(thread_task, i + 1);
     }
     std::cout<< "Done spawning threads! Now wait for them to join\n";
     for (auto& t: threads) { t.join();
     }
     std::cout<< "All threads joined.\n";

     return EXIT_SUCCESS;
 }

std::thread其他成員函數(shù)get_id: 獲取線程 ID
  1. 如果該std::thread是joinable狀態(tài)(joinable狀態(tài)后面會提到),那么就返回一個獨一無二的(unique)的當(dāng)前std::thread的id(std::thread::id).
  2. 如果該std::thread是not joinable狀態(tài),返回std::thread::id();
joinable: 檢查線程是否可被 join

該函數(shù)返回一個bool值:

  1. 如果當(dāng)前std::thread對象是default-constructor構(gòu)造出來的返回false.
  2. 如果當(dāng)前std::thread對象被移動到了其他std::thread對象返回false.
  3. 如果當(dāng)前std::thread對象的detach()和join()被調(diào)用過了返回false.

檢查當(dāng)前的線程對象是否表示了一個活動的執(zhí)行線程,由默認(rèn)構(gòu)造函數(shù)創(chuàng)建的線程是不能被 join 的。
另外,如果某個線程 已經(jīng)執(zhí)行完任務(wù),但是沒有被 join 的話,該線程依然會被認(rèn)為是一個活動的執(zhí)行線程,因此也是可以被 join 的。

detach: Detach 線程

Detach 線程。 將當(dāng)前線程對象所代表的執(zhí)行實例與該線程對象分離,使得線程的執(zhí)行可以單獨進行。一旦線程執(zhí)行完畢,它所分配的資源將會被釋放。


調(diào)用 detach 函數(shù)之后:

  • *this不再代表任何的線程執(zhí)行實例。
  • joinable() == false
  • get_id() == std::thread::id()

📌另外,如果出錯或者joinable() == false,則會拋出std::system_error。

join: Detach 線程

block(阻塞)調(diào)用join()的線程,直到std::thread所在的線程完成,與此同時std::thread獨顯被設(shè)置為not joinable.

swap: Swap 線程

Swap 線程,交換兩個線程對象所代表的底層句柄(underlying handles)。

native_handle:返回 native handle

返回 native handle(由于 std::thread 的實現(xiàn)和操作系統(tǒng)相關(guān),因此該函數(shù)返回與 std::thread 具體實現(xiàn)相關(guān)的線程句柄,例如在符合 Posix 標(biāo)準(zhǔn)的平臺下(如 Unix/Linux)是 Pthread 庫)。

  • 示例
#include#include#include#include#includestd::mutex iomutex;
 void f(int num)
 {std::this_thread::sleep_for(std::chrono::seconds(1));

  sched_param sch;
  int policy; 
  pthread_getschedparam(pthread_self(), &policy, &sch);
  std::lock_guardlk(iomutex);
  std::cout<< "Thread "<< num<< " is executing at priority "
 << sch.sched_priority<< '\n';
 }

 int main()
 {std::thread t1(f, 1), t2(f, 2);

   sched_param sch;
   int policy; 
   pthread_getschedparam(t1.native_handle(), &policy, &sch);
   sch.sched_priority = 20;
   if(pthread_setschedparam(t1.native_handle(), SCHED_FIFO, &sch)) {   std::cout<< "Failed to setschedparam: "<< std::strerror(errno)<< '\n';
   }

   t1.join();
   t2.join();
 }
hardware_concurrency[static]

檢測硬件并發(fā)特性,返回當(dāng)前平臺的線程實現(xiàn)所支持的線程并發(fā)數(shù)目,但返回值僅僅只作為系統(tǒng)提示(hint)。

  • 示例
#include#includeint main() {unsigned int n = std::thread::hardware_concurrency();
   std::cout<< n<< " concurrent threads are supported.\n";
 }
std::this_thread 命名空間中相關(guān)輔助函數(shù)
  • get_id:返回一個獨一無二的當(dāng)前線程的ID(一般也就是unsigned int類型).
  • yield: 使正在處于運行狀態(tài)的該線程,回到可運行狀態(tài),以允許其他具有相同優(yōu)先級的線程獲得先執(zhí)行的機會。但是很有可能該線程剛剛回到可執(zhí)行狀態(tài)又被再次執(zhí)行。
  • sleep_until: 線程休眠至某個指定的時刻(time point),該線程才被重新喚醒
  • sleep_for: 線程休眠某個指定的時間片(time span),該線程才被重新喚醒,不過由于線程調(diào)度等原因,實際休眠時間可能比 sleep_duration 所表示的時間片更長。
std::thread的可聯(lián)結(jié)性

一個 std::thread 對象只可能處于可聯(lián)結(jié)或不可聯(lián)結(jié)兩種狀態(tài)之一。即 std::thread 對象是否與某個有效的底層線程關(guān)聯(lián)。


  • 可聯(lián)結(jié):當(dāng)線程可運行、已經(jīng)運行或處于阻塞時是可聯(lián)結(jié)的。但如果某個底層線程已經(jīng)執(zhí)行完任務(wù),但是沒有被 join 的話,該線程依然會被認(rèn)為是一個活動的執(zhí)行線程,仍然處于 joinable 狀態(tài)。
  • 不可聯(lián)結(jié):不帶參構(gòu)造的std::thread對象為不可聯(lián)結(jié),因為底層線程還沒創(chuàng)建;已經(jīng)移動的std::thread對象為不可聯(lián)結(jié);已經(jīng)調(diào)用join或detach的對象為不可聯(lián)結(jié)狀態(tài)。
  • joinable():判斷是否可以成功使用join()或者detach(),返回true 表示可以,否則返回false
std::thread 對象析構(gòu)

std::thread 對象析構(gòu)時,會先判斷joinable(),如果可聯(lián)結(jié),則程序會直接被終止(terminate)。
因此,在創(chuàng)建 thread 對象以后,要在隨后的某個地方顯式地調(diào)用 join 或 detach 以便讓std::thread處于不可聯(lián)結(jié)狀態(tài)。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享標(biāo)題:C++11std::thread的使用-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article40/ipoeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、企業(yè)網(wǎng)站制作、響應(yīng)式網(wǎng)站、建站公司網(wǎng)站排名、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司