臨界區(qū):臨界區(qū)是一種最簡單的同步對象,它只可以在同一進程內(nèi)部使用。它的作用是保證只有一個線程可以申請到該對象。
互斥量與臨界區(qū)的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創(chuàng)建互斥量需要的資源更多,所以如果只為了在進程內(nèi)部是用的話使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量。因為互斥量是跨進程的互斥量一旦被創(chuàng)建,就可以通過名字打開它。
互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進程使用來進行同步數(shù)據(jù)操作,而其他的對象與數(shù)據(jù)同步操作無關(guān),但對于進程和線程來講,如果進程和線程在運行狀態(tài)則為無信號狀態(tài),在退出后為有信號狀態(tài)。所以我們可以使用WaitForSingleObject來等待進程和線程退出。
通過互斥量我們可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現(xiàn)在一位用戶購買了一份三個并發(fā)訪問許可的數(shù)據(jù)庫系統(tǒng),你的老板會要求你根據(jù)用戶購買的訪問許可數(shù)量來決定有多少個線程/進程能同時進行數(shù)據(jù)庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計數(shù)器。
事件,前面講的信號燈和互斥量可以保證資源被正常的分配和使用,而事件是用來通知其他進程/線程某件操作已經(jīng)完成。
如果某個線程必須等待某些事件發(fā)生后才能存取相應(yīng)的資源,用CEvent;
如果一個應(yīng)用同時可以有多個線程存取相應(yīng)資源,用CSemaphore;
如果有多個應(yīng)用(多個進程)同時存取相應(yīng)資源,用CMutex,否則用CCriticalSection