C 多執行緒,高併發,成員函式做執行緒函式

2021-09-28 11:17:26 字數 1178 閱讀 3037

如果成員函式做執行緒函式的話,那麼會有乙個問題

就是在主線程裡,如果使用了thread.detach()方法,那麼如何保證傳遞到作為執行緒函式的成員函式中的變數在主線程結束銷毀之前,成功得到,並與主線程裡的變數脫離記憶體關聯?

你會說,直接這樣寫

void

threadtest01

(const

int&a)

intmain()

這樣寫,確實沒問題,執行緒初始函式中的int型別的引用a指的是新的位址,也就是說,雖然使用的是引用,但是實際上是安全的,引用的變數指向的是新的記憶體位址.

但是雖然使用了引用,實際上使用的是新的記憶體內的變數,但是,那你為啥不直接這樣寫?

void

threadtest01

(int a)

你說的沒毛病,就是該這麼寫

但是如果是陣列,你怎麼辦呢?

void

threadtest01

(const

char

*a)int

main()

這就完全不可預知了,因為指標指的就是主線程中的陣列的記憶體,如果主線程結束銷毀了,那麼執行緒中的陣列是什麼就完全不可預知了,這是很危險的,怎麼解決這個問題呢?

可以使用隱式型別轉換的方法

void

threadtest01

(const string &a)

intmain()

這樣就行了,隱式轉換,會給string乙個新的記憶體位址,但是這也不是完全安全的因為如果還沒又進行隱式轉換,主線程就已經結束了,char陣列已經銷毀了,這樣又是完全不可預知了

那麼怎麼解決這個問題呢?

建立臨時變數是個好方法

void

threadtest01

(const string &a)

intmain()

你會問,這樣和上面有什麼區別嗎?萬一臨時變數還沒建立呢,主線程就已經結束了,那結果不還是一樣?

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...

多執行緒高併發

個人總結,帶有個人主觀,請選擇性 1,實現 runable 2,使用 thread 3,執行緒池建立 executorse newcachedthreadpool 其實哪有那麼多建立方式,本質上都是實現了runable 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...

高併發和多執行緒

高併發和多執行緒 總是被一起提起,給人感覺兩者好像相等,實則高併發 多執行緒 多執行緒是完成任務的一種方法,高併發是系統執行的一種狀態,通過多執行緒有助於系統承受高併發狀態的實現。高併發是一種系統執行過程中遇到的一種 短時間內遇到大量操作請求 的情況,主要發生在web系統集中大量訪問或者socket...