C 併發實戰 (二)執行緒管理

2022-07-11 07:45:14 字數 2236 閱讀 9237

前一篇沒用markdown編輯器感覺不好看,刪了重新發

本篇主要講述執行緒的管理,主要包括建立和使用執行緒

執行緒出現是為了執行任務,執行緒建立時會給乙個入口函式,當這個函式返回時,該執行緒就會退出,最常見的main()函式就是主線程的入口函式,在main()函式返回時主線程就結束了。

如何啟動乙個執行緒呢?就如上所述,需要給執行緒物件乙個入口函式。

#include #include using namespace std;

void hello()

int main()

例如:

#include #include #include #include using namespace std;

void hello()

int main()

這個**中線程執行的hello函式已經結束,依然可以join

在上面的**例子中,使用了執行緒物件的join函式,這個函式的作用就是等待執行緒完成。同時需要注意,乙個執行緒不能被join兩次。可以通過執行緒物件的joinable()函式判斷當前函式是否可以被join。

std::thread t(do_thread_work);

if(t.joinable())

t.join();

除了可以等待執行緒完成,還可以分離執行緒,讓執行緒自己執行,也就是所謂的在後台執行執行緒,當執行緒物件被銷毀後,執行緒可能仍在執行,此時,沒有直接的方法可以與其通訊,不能再通過執行緒物件獲取到該執行緒,也不能再被join,所以要注意資源的請求和釋放。

參照守護程序的概念,被分離的執行緒通常被稱作守護執行緒。

std::thread t(do_some_background_work);

t.detach();

assert(!t.joinable());

為了分離執行緒,執行緒物件必須與乙個執行緒相關聯,不能在沒有執行緒關聯的執行緒物件上使用detach(),join()函式也是同理,因此也可以使用joinable()函式來判斷當前函式是否可以detach。

std::thread t(my_function);

trycatch

t.join();

當然還有其他的做法,利用raii的思想,類似智慧型指標,對thread物件進行封裝。

#include #include class thread_guard 

~thread_guard()

}private:

std::thread& t_;

};void hello()

int main()

執行緒的入口是個函式,作為使用者肯定是想傳遞一些函式引數的。操作也比較簡單,將額外的引數傳遞給std::thread的夠凹函式就可以了。但是,需要重視的一點是,引數預設上會被複製到內部儲存空間,然後在那新建立的執行緒可以訪問這些引數,即便函式中的相應引數期待著引用

這個意思就是說,傳遞引數給縣城函式就像是給普通函式傳遞引數一樣,預設傳遞的是形參,而且就算你加了引用,傳遞的也是形參。是std::thread的建構函式做的這個事情,他無視函式所期望的引用盲目的複製了所提供的值

解決方案也很簡單,使用std::ref()包裹你想要以引用傳遞的引數。

void update_data_for_widget(widget_id w, widget_data& data);

void fun(widget_id w)

和std::unique_ptr類似,std::thread是可移動並且非可複製的,這意味著一般不會有兩個執行緒物件指向同乙個執行緒例項,如果出現此情況會發生異常。如果同時給乙個執行緒物件關聯兩個執行緒例項,也會觸發異常。

void some_function();

void some_other_function();

std::thread t1(some_function);

std::thread t2 = std::move(t1);

t1 = std::thread(some_other_function);

t3 = std::move(t2);

t1 = std::move(t3); //此項操作將會終止程式!

執行緒識別符號是std:
Java併發程式設計實戰筆記二(執行緒安全性)

當多個執行緒訪問某個類時,不管執行時採用何種排程方式或者執行緒如何交替執行,主調 中不需要任何額外的同步或協同 這個類始終都能表現出正確的行為,那麼就稱這個類是執行緒安全的。執行緒安全性的根源在於多執行緒對共享變數的併發訪問出現的 有三種方式可以修復這個問題 將狀態變數修改為不可變的變數 final...

c 多執行緒thread操作(二)執行緒管理

c 多執行緒thread操作 一 環境部署 c 多執行緒thread操作 二 執行緒管理 c 多執行緒thread操作 三 資料競爭互斥訪問 c 多執行緒thread操作 四 死鎖的問題和解決 c 多執行緒thread操作 五 unique lock加鎖 c 多執行緒thread操作 六 條件變數的...

併發 二 執行緒安全問題

一 執行緒安全 如圖示執行緒的工作記憶體與主記憶體的區別。加了violate關鍵字以後,就能保證執行緒記憶體中的變數及時回寫。但是這種情況一般適用於低併發,並且記憶體操作不涉及底層機器指令操作的情況下。對於如下所示的 public class thread lite public static vo...