c 多執行緒同步(1)

2021-06-08 20:08:44 字數 2033 閱讀 4026

此篇討論一下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,確定事件是手動還是自動 ...