1. 程式人生 > 實用技巧 >VC++多執行緒工作筆記0006---執行緒間同步機制1

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就結束了

這樣怎麼辦呢?其他執行緒還等著用呢,所以線上程中,要做的同步操作,儘量,處理的資料不要太大,太多

可能會出問題.