推薦參考部落格:秒殺多執行緒第五篇 經典執行緒同步 關鍵段cs
關於臨界區的觀念,一般作業系統書上面都有。
適用範圍:它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的**快同步,效率比較高
windows中與臨界區有關的結構是 critical_section,關於該結構體的內部結構可參考here
使用時,主線程中要先初始化臨界區,最後要刪除臨界區,具體使用見下面**:
從乙個例子來說明:假設有三個執行緒都需要使用印表機,我們可以把列印的**放到臨界區,這樣就可以保證每次只有乙個執行緒在使用印表機。
#include
#include
#include
#include
using
namespace
std;
//定義乙個臨界區
critical_section g_cs;
//執行緒繫結的函式返回值和引數是確定的,而且一定要__stdcall
unsigned __stdcall threadfun(
void
*param)
int
main()
再看另外乙個問題:編寫乙個程式,開啟3個執行緒,這3個執行緒的id分別為a、b、c,每個執行緒將自己的id在螢幕上列印10遍,要求輸出結果必須按abc的順序顯示;如:abcabc….依次遞推, 仿照文章windows多執行緒同步--訊號量中的**,我們把訊號量替換成臨界區。
#include
#include
#include
#include
using
namespace
std;
//宣告3個臨界區
critical_section g_cs1, g_cs2, g_cs3;
//執行緒繫結的函式返回值和引數是確定的,而且一定要__stdcall
unsigned __stdcall threadfuna(
void
*)
return
1;
}
unsigned __stdcall threadfunb(
void
*)
return
2;
}
unsigned __stdcall threadfunc(
void
*)
return
3;
}
int
main()
關於臨界區的詳細解釋清參考秒殺多執行緒第五篇 經典執行緒同步 關鍵段cs
執行緒同步之臨界區
臨界區 當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。臨界區執行緒同步適用範圍 它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的 快同步,效率比較高。在.net中有monitor lock等方式是以臨界區的方式來實現執...
多執行緒程式設計 臨界區
1 windows api建立執行緒 include 包含相應標頭檔案 include dword winapi myfun1 lpvoid lpparameter 宣告執行緒函式 dword winapi myfun2 lpvoid lpparameter int main 主函式 else 如果...
Linux多執行緒臨界區問題
臨界區指的是乙個訪問共用資源 例如 共用裝置或是共用儲存器 的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如 semaphore。只能被單一執...