C 多執行緒基礎學習筆記(三)

2022-07-19 09:51:09 字數 2171 閱讀 4757

一、detach()大坑

由監檢視可知,實參n和形參a的位址並不同,所以實際是值傳遞,並因此最好不要用引用,直接用值傳遞就行了。

主線程的str_m和str的位址卻相同,那麼當子執行緒和主線程分離時,就會出現問題。這裡講乙個改進的方法,把形參char* str改成const string& str,即把傳進來的引數隱式地轉換成乙個(構造了)string物件,會發現主線程的str_m和子執行緒形參str的位址是不同的,但實際上問題還是存在,如果在在傳遞主線程的引數str_m前,str_m就被**了,乙個被**的變數作為引數結果可想而知。所以還要再改多一步,就是在main()中實參str_m改成string(str_m),先構造乙個string物件,再將這個物件作為引數傳入子執行緒,這時又會有疑問,難道不會出現在string(str_m)前str_m就被系統**了嗎?答案是不會的,測試方法這裡不細說了。

下面是改進後的**

1 #include 2 #include 

3 #include 4

using

namespace

std;56

void mythread(int a, const

string&str)711

intmain()

1221 cout << "

main_thread

"<

22 system("

pause");

23return0;

24 }

二、std::this_thread::get_id()執行緒id,每個執行緒都有自己的執行緒id,各個id都不同,獲取執行緒id方法為std::this_thread::get_id()

1 #include 2 #include 

3 #include 4

using

namespace

std;

5classca6

13 ca(const ca&m) :a(m.a)

1417

};18

void mythread(const ca&cc)

1923

intmain()

24

三、std::ref()上述**執行可知,如果向子執行緒傳入乙個物件,會呼叫拷貝建構函式,這時用detach()是安全的,但是如果想要通過子執行緒來修改主線程物件的資料是不允許的,可以把18行的const去掉試試,是會報錯的,那麼可以用std::ref()來使這個物件得以修改。(當然,18行處也可以改成void mythread(ca cc),這樣也是可以修改,但是修改的只是拷貝的物件,對主線程的物件沒有影響,而且會呼叫兩次拷貝建構函式,浪費記憶體)

由結果可知,並不會呼叫拷貝建構函式,在子執行緒中操作的是主線程中的物件。這時需要注意了,如果用detach(),就不安全了。還是那個問題,對已經釋放的變數進行非法操作必定帶來隱患。

C 多執行緒學習筆記三

thread 乙個非同步任務開啟乙個thread,具有專有性 threadpool 開啟非同步任務只需要向其借用執行緒,使用完後歸還 threadpool.queueuserworkitem obj new func string hello world console.writeline 主線程 ...

多執行緒程式設計學習筆記 基礎(三)

1.如下。using system using system.collections.generic using system.linq using system.text using system.threading 引入執行緒 using system.diagnostics namespace...

C 多執行緒基礎學習筆記(七)

一 std async和std future的用法 std async是乙個函式模板,std future是乙個類模板 std async std launch async,mythread 如果std async 的第乙個引數改成std lauch deferred,那麼執行緒不會被馬上執行,而是...