舉例說明
在Java裡面,通過synchronized進行同步的保證。
在C++11裡面,通過std::mutex的加鎖和解鎖來保證。
方式
- 互斥鎖(Mutex)nn
互斥量是最簡單的同步機制,即互斥鎖。多個進程(線程)均可以訪問到一個互斥量,通過對互斥量加鎖,從而來保護一個臨界區,防止其它進程(線程)同時進入臨界區,保護臨界資源互斥訪問。nn
2.條件變量(conditionvariable)nn
條件變量适合多個進程(線程)等待同一事件發生,然後去幹某事。舉一個簡單的例子:
生産者和消費者模型:n
多個消費者去等待生産者生産物品,消費者去消耗物品。當生産者生産出來一件物品時,便可以通知所有的消費者(當然也可以隻通知其中一個等待的消費者)---可以去消耗物品了。這時多個消費者便去争搶物品,誰快誰拿到物品消耗。當物品被消耗完時,消費者就等待生産者。就類似于這樣的場景。n
條件變量必須配合互斥量一起工作。為什麼?因為生産者生産出來的物品是臨界資源,即所有進程和線程都可以使用的公共資源,則在一個時刻僅允許一個消費者去取。這時便使用互斥量去保護臨界資源。n
3.讀寫鎖(reader-writerlock)n
讀寫鎖适合于使用在讀操作多,寫操作少的情況,比如數據庫。讀寫鎖讀鎖可以同時加很多,但是寫鎖是互斥的。當有進程或者線程要寫時,必須等待所有的讀進程或者線程都釋放自己的讀鎖方可以寫。數據庫很多時候可能隻是做一些查詢。nn
4.信号量(semaphore)nn
在生産者消費者模型中,對任務數量的記錄就可以使用信号量來做。可以理解為帶計數的條件變量。當信号量的值小于0時,工作進程或者線程就會阻塞,等待物品到來。當生産者生産一個物品,會将信号量值加1操作。這是會喚醒在信号量上阻塞的進程或者線程,它們去争搶物品。



















