c 中的併發執行緒 二

2021-10-24 19:00:56 字數 1719 閱讀 8410

主線程不必等子執行緒執行完畢,先走為敬!

struct func

void

operator()

()}}

;void

oops()

主函式執行緒已結束,my_thread執行緒中的函式還在執行.

呼叫join()的行為,還清理了執行緒相關的儲存部分,這樣std::thread物件將不再與已經完成的執行緒有任何關聯。這意味著,只能對乙個執行緒使用一次join();一旦已經使用過join(),std::thread物件就不能再次加入了,當對其使用joinable()時,將返回false。

#include

#include

using namespace std;

void

myprint()

int main (

void

)else

mytob.

join()

;if(mytob.

joinable()

)else

cout<<

"i love china "

}

執行結果

true

我的執行緒開始執行了

我的執行緒執行結束了

false

i love china

所以可以改進成這樣的形式:

#include

#include

using namespace std;

void

myprint()

int main (

void

)return0;

}

#include

#include

using namespace std;

class ta

void

operator()

()};

int main (

void

)

執行結果為:

i love china 

m

原因這是因為主線程執行完之後,引用的變數就已經被銷毀了.但這個變數還在子執行緒中在用,所以導致程式異常,產生不可預料的結果.

另乙個知識點是:一旦呼叫了detach(),那主線程執行結束了,這裡用到的ta物件還存在嗎?答案是不存在的

但這個物件是被複製到子執行緒中去,原來的ta會被銷毀,但是所複製的ta物件依舊存在.所以只要這個ta類物件裡沒有引用,沒有指標,那麼就不會產生問題.

#include

#include

using namespace std;

int main (

void);

thread mytob

(mylamthread)

; mytob.

join()

; cout<<

"i love china "

}

執行結果為:

我的執行緒開始了

我的執行緒結束了

i love china

C 中的併發執行緒 一

當我想要用另乙個執行緒實現hello world函式時 mian.c函式 include include using namespace std void hello intmain 對於應用程式來說,該程式啟動了乙個全新的執行緒來實現,將執行緒數量一分為二初始執行緒是main 而新執行緒由std ...

《多執行緒併發》(二)

1.執行緒通訊 概念 執行緒通訊的目標是使執行緒間能夠互相傳送訊號。另一方面,執行緒通訊使執行緒能夠等待其他執行緒的訊號,多個執行緒在處理同乙個資源,並且任務不同時,需要執行緒通訊來幫助解決執行緒之間對同乙個變數的使用或操作。就是多個執行緒在操作同乙份資料時,避免對同一共享變數的爭奪。於是我們引出了...

Ice筆記 C 執行緒與併發(二)

執行緒 1.thread類 1.1概述 ice中的基礎執行緒是由threadcontrol類和thread類來提供的 在iceutil iceutil.h中定義 thread類是乙個抽象基類,擁有乙個純虛方法run。要建立執行緒,必須特化thread類,並實現run方法。1.2 其成員函式 1 id...