VC++多執行緒工作筆記0006---執行緒間同步機制1
技術交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
所有的語言程式碼都會轉換成彙編,彙編轉換為二進位制程式碼執行,
多執行緒操作,操作同一個資源可能會出問題.
演示一下多個執行緒操作同一個變數,會出問題.
還是用原來工程
50*100 =5000次迴圈
啟動點選建立執行緒,然後點選我要看結果.除錯
這裡咱們建立了50個執行緒,然後,這個50個執行緒去對g_Num進行+1,然後
進行-1,按說最後的結果應該是0,最後打印出來,但是實際上,
可以看到,實際上,並不是,這就是50個執行緒同時處理這一個變數會出現的執行緒不同步問題
去解決
這個InterlockedExchangeAdd這個是可以這樣,就是比如一次加上5,加上-5之類的.
然後用原子操作,進行執行緒同步.
.
然後再去除錯,啟動,點選建立執行緒,然後點選我要看結果.
然後到這個地方可以看到這裡就是0了,這樣就實現了執行緒的同步
其他的互鎖函式
上面是簡單的同步一個變數,單實際上,咱們可能操作
結構體,或者連結串列等等.
咱們看這些怎麼同步.
這裡建立50個執行緒,每個執行緒都會被傳入比如,第一個傳入10,第二個傳入20..這樣
把執行緒函式收到的值,加入到g_ArrString這個陣列中去.
然後在我要看結果按鈕中,就是,獲取g_ArrString陣列的值的個數,然後msg彈出來
然後把陣列中的每個值打印出來.
啟動執行一下
可以看到報錯了,這個是因為,多個執行緒同時運算元組,往陣列新增資料導致的.
這樣解決
在修改陣列,之前先呼叫EnterCriticalSection
修改前,再呼叫LeaveCriticalSection這樣就可以.
TryEnterCriticalSection
這個是嘗試進入,返回true就是進入成功,否則返回false
好去實現.
首先在ThreadTestDlg.cpp中宣告這個一個
CRITICAL_SECTION g_CS;
然後在點選我要建立,的按鈕中假如
初始化
InitalizeCriticalSection(&g_CS);
然後使用完了,咱們可以在,獲取結果的按鈕函式中呼叫
DeleteCriticalSection(&g_CS);
然後在對陣列進行操作的時候,呼叫
EnterCriticalSection(&g_CS);
然後運算元組,然後
LeaveCtiticalSection(&g_CS);
再執行看一下結果
可以看到這個時候就不崩潰了.
打印出的資料也正常,就是從0到4999,5000個數字.
1.不是系統核心的物件,系統核心物件一般比如是視窗控制代碼啊,
檔案控制代碼啊,這種.
2.不是系統核心物件,所以速度快,不需要跟系統核心打交道.
3.因為不是系統核心物件,所以不能跨程序使用,
因為程序是由作業系統管理的.
4.多次呼叫EnterCritical Section 就要多次呼叫LeaveCritical Section來退出
5.不要有交叉操作,比如執行緒1,用的是Critical Sections1進行操作的,那麼執行緒2是用Critical Sections2進行
操作的.那麼這個時候不要產生,比如執行緒1,又想用Critical Sections2了,這樣交叉操作可能會造成死鎖.
6.就是說一個執行緒如果先呼叫了EnterCriticalSection但是還沒有來得及呼叫LeaveCriticalSection就結束了
這樣怎麼辦呢?其他執行緒還等著用呢,所以線上程中,要做的同步操作,儘量,處理的資料不要太大,太多
可能會出問題.