C 11的多執行緒併發程式設計(三)

2021-10-02 16:54:53 字數 2759 閱讀 7003

疫情確診加疑似都快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.初...