C++ 作業系統程序中執行緒同步的四種方式
執行緒同步的定義:
同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同”字從字面上容易理解為一起動作其實不是,“同”字應是指協同、協助、互相配合。如程序、執行緒同步,可理解為程序或執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;A再繼續操作。
所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回,同時其它執行緒也不能呼叫這個方法。按照這個定義,其實絕大多數函式都是同步呼叫(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。例如Window API函式SendMessage。該函式傳送一個訊息給某個視窗,在對方處理完訊息之前,這個函式不返回。當對方處理完畢以後,該函式才把訊息處理函式所返回的LRESULT值返回給呼叫者。
執行緒同步的四種方式:
1:臨界區
當多個執行緒訪問一個獨佔性共享資源時,可以使用臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或程式碼段,若其他執行緒想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止
2:事件
事件機制,則允許一個執行緒在處理完一個任務之後,主動喚醒另外一個執行緒執行任務。利用事件機制,執行緒A 可以通知執行緒B何時更新資料
3:互斥量
互斥物件和臨界區物件非常相似,只是允許線上程中使用,而臨界區只限與同一程序的各個執行緒之間使用,節省時間,增加效率
4:訊號量
當需要一個計數器來限制可以使用某共享資源的執行緒數目時,可以使用“訊號量”物件。當計數器為0時,所控制的資源的訪問嘗試被放入到一個佇列中等待,直到超時或計數器不為0為止