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