此篇討論一下c++中的執行緒同步。
執行緒同步方式:
臨界區事件
互斥量訊號量
為什麼要執行緒同步?
從之前的討論及實際的專案中,可以看到執行緒同步給我們帶來了很多便利性,但是多執行緒也同時給我們帶來了很多麻煩:一方面,在開發除錯階段帶來了很大的難度;另一方面,則需要考慮資源訪問的一致性原則。因為在程式中使用多執行緒的時候,每乙個執行緒並不會各行各事,每個執行緒之間必然會存在一些聯絡。如果兩個或者多個執行緒訪問同乙個獨占性的系統資源,這樣會導致系統錯誤。
下面對實現執行緒同步的幾種方法分別介紹
(1) 臨界區
臨界區是一段獨佔對某些共享資源的訪問**,在任意時刻只允許乙個執行緒對共享資源訪問。如果有多個執行緒試圖同時訪問臨界區,那麼只有乙個執行緒進入臨界區,其他試圖訪問臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開,其他執行緒可以繼續搶占臨界區。
需要說明的是,在使用臨界區時,一般不允許其執行時間過長,因為只要進入臨界區的執行緒不離開,其他檢視進入此臨界區的執行緒都會掛起,進入等待狀態,因此這樣在一定程度上影響程式的效能。因此,不要使臨界區一直處於未釋放的狀態。
還需要注意的是,雖然臨界區同步速度比較快,但是只能用來同步本程序內的執行緒,而不能跨執行緒同步。
mfc中,有乙個ccriticalsection類,此類中有兩個方法lock和unlock,只需要在需要同步的**前後假如這兩個函式,就可以實現臨界區資源。
例子如下(部分**):
[cpp]view plain
copy
ccriticalsection critical_section;
char
g_array[10];
uint
writew(
lpvoid
pparam)
"color:#ff0000;"
>critical_section.unlock();
return
0;
} uint
writed(
lpvoid
pparam)
"color:#ff0000;"
>critical_section.unlock();
return
0;
}
建立執行緒:
[cpp]view plain
copy
void
cmthread8dlg::onwritew()
void
cmthread8dlg::onwrited()
執行結果:
從執行結果看,讀的執行緒只能等到寫的執行緒從臨界區出來後才能訪問臨界區。
(2) 事件
例項參見本部落格:c++createevent函式在多執行緒中使用及例項
此例項中採用createevent 事件函式實現多執行緒同步的。
也可以採用mfc中的cevent類實現多執行緒同步。
部分**如下:
[cpp]view plain
copy
cevent event;
char
g_array[10];
uint
writew(
lpvoid
pparam)
event.setevent();
return
0;
}
uint
writed(
lpvoid
pparam)
return
0;
}
建立執行緒的**和臨界區中顯示的**一樣。
主要通過waitforsingleobject函式實現多執行緒的同步。此函式等待上乙個執行緒釋放事件,即事件變成有訊號狀態時,才執行此執行緒下面的程式。
1 多執行緒同步
實現多執行緒 1.基礎thread類 2.實現runnable介面 描述 1.當多個執行緒訪問 mythread 這個類方法的時候,一排隊的方式去進行訪問處理 cpu的分配 2.乙個執行緒要執行 synchronized 方法修飾的 嘗試去獲取鎖,如果拿到鎖,則立即去執行。如果拿不到鎖,則會一直不斷...
C 多執行緒同步
在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...
C 多執行緒 執行緒同步事件
1 事件 事件是核心物件,多用於執行緒間通訊,可以跨程序同步 2 事件使用 1 建立事件 handle createevent lpsecurity attribute slpeventattributes,安全控制,一般直接傳入null bool bmanualreset,確定事件是手動還是自動 ...