疫情確診加疑似都快7w+了,能做的也只能在家大門不出,二門不邁了,寫一篇繼續記錄c++11的多執行緒併發程式設計
在建立的子執行緒中,呼叫類的物件時考慮到在主線程定義引數執行帶參建構函式時,子執行緒detach時,主線程線執行完清除變數,那麼一般在建立主線程時直接構造物件,並在輸入函式出增加引用。這樣就可以保證,物件帶參構造執行於主線程,舉個例子:
可以看到帶參建構函式執行於主線程。因此,如果在建立執行緒的時候傳遞簡單型別引數,例如,int,那麼就直接值傳遞;如果是傳遞類物件,就像上例,建議都在建立執行緒的時候構建出臨時物件來,然後在呼叫函式入口處,用引用引數接。
例如,當我們要呼叫函式對類的成員進行改動,那麼就會出現這樣的問題:
#include
#include
using
namespace std;
classaa
(const a &a):i
(a.i)~a
()};
void
myfunc
(const a &a)
intmain()
我們預期的情況,我在呼叫函式,引數為引用物件,那麼這個a.i的值應該就是100,但是會有兩個執行緒兩個不同的成員值,因此,證明了之前講的,他還是進行了拷貝建構函式,新的物件的成員值了
解決辦法只要在建立輸入引數的時候加上ref();就可以出現同乙個物件
傳參為智慧型指標以及類成員函式
這個舉個例子,演示當建立執行緒的時候,智慧型指標和類成員函式為引數的時候,執**況:
#include
#include
using
namespace std;
classaa
(const a &a)
:mynum
(a.mynum)
void
myfunction
(int num)~a
()};
void
myfunc
(unique_ptr<
int> ptr)
intmain
(int argc,
char
* ar**)
通過執行結果可以看到,兩個執行緒同步執行,會出現交叉情況,main執行緒是最後結束,成員函式執行成功,且智慧型指標指向的也傳遞成功,當指標move操作之後,ptr已經失效了,訪問則會報錯;
多執行緒問題
這裡舉個多執行緒針對全域性資料的訪問案例:
執行結果顯示,當多個執行緒共同讀取全域性變數時,能夠有效的進行,
上面這個例子,是針對唯讀資料,是安全的,不需要其他處理,但是如果我乙個執行緒要讀,而另外乙個執行緒要寫同乙個資料,那麼會出現什麼情況,在作業系統切換的過程中坑定會崩潰,借鑑個案例:
乙個車票視窗有兩個執行緒,乙個接受乘客排隊的購買指令,另乙個負責輸出乘客指令進行分析指令進行處理,那麼根據排隊順序來,需要乙個佇列來從尾部儲存指令,然後從頭部輸出指令,因此以備兩個程序進行讀寫。
#include
#include
#include
using
namespace std;
classa}
void
outcommand()
else}}
private
: list<
int> ticket;};
intmain
(int argc,
char
*ar**)
當執行的時候,什麼情況都有,有按順序來的,有一直都顯示沒有人,然後全是人排隊,因此,下乙個開始記錄,如何互斥的訪問這個lis C 11併發程式設計 多執行緒std thread
c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...
C 11 多執行緒 併發程式設計總結
建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...
C 11併發程式設計 多執行緒std thread
一 概述 c 11引入了thread類,大大降低了多執行緒使用的複雜度,原jtpbyn先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 二 建構函式 1.預設建構函式 2.初...