1. 程式人生 > 實用技巧 >C++ 下的多執行緒

C++ 下的多執行緒

簡單的說:執行緒是可被排程的最小的指令序列,執行緒是作業系統的一部分,不同的作業系統,對實現,和排程策略不同。

多執行緒的優勢:

  1. 快速響應:比如在一個單執行緒程式中,如果主執行緒block在一個費時的任務中(比如I/O操作),整個程式會“凍結”住,無法響應外界的輸出。通過將互動任務與這個費時的任務獨立成兩個執行緒可以解決這個問題。但這並不是主要的用途,因為這種情況通過non-blocking I/O和Unix signal解決,並且帶來更小的副作用。
  2. 更好的效能:在現代計算機中,通常會有多個核心甚至多個CPU,通過多執行緒可以”更容易“使得多個核心並行(Parallel)執行,這裡要注意,在當今的計算機中就是單執行緒,也會在多個核上執行,將一些沒有關係的指令執行到其他的核上,提高效能。

例如在Windows中通過CreateThread()建立程序,而在linux中使用POSIX thread模型,pthread_create()建立執行緒,並且在編譯是要加入-pthread選項來表示正在使用POSIX thread庫。可見,不同作業系統有著相似的執行緒概念,卻包含這很多不同的實現細節。因此想要進行跨平臺的多執行緒開發,就需要一種執行緒庫作為thread wrapper。

C++ 語言層面的多執行緒 thread 類

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include
<string> #include<unistd.h> #include<thread> void Threadtest(int time) { std::this_thread::sleep_for(std::chrono::seconds(time)); std::cout<<"threadtest is run"<<std::endl; } int main() { std::thread t1(Threadtest,2); // 主執行緒阻塞,等待子執行緒完成 c++ 語言層面必須等待子執行緒 t1.join();
// t1.detach() // 分離子執行緒,主執行緒不在等待子執行緒 std::cout<<"main thread is done"<<std::endl; return 0; }

join 和 detach 的區別總結

  • 呼叫thread::join()時,呼叫執行緒將阻塞,直到執行執行緒完成。基本上,這是一種可以用來知道執行緒何時完成的機制。當thread::join()返回時,作業系統執行執行緒已經完成,並且C++thread物件可以被銷燬。
  • 呼叫thread::detach(),將執行執行緒與thread物件“分離”,並且不再由thread物件表示-它們是兩個獨立的事物。可以銷燬C++thread物件,並且可以繼續執行OS執行緒。如果程式需要知道該執行執行緒何時完成,則需要使用其他機制。不能再對該join()物件呼叫thread,因為它不再與執行執行緒相關聯。