线程同步机制:互斥量、信号量、读写锁、条件变量
一、互斥量(mutex)
互斥量本質(zhì)上是一把鎖,在訪問(wèn)共享資源前對(duì)互斥量進(jìn)行加鎖,在訪問(wèn)完成后釋放互斥量上的鎖。
對(duì)互斥量進(jìn)行加鎖以后,任何其它試圖再次對(duì)互斥量加鎖的線程將會(huì)被阻塞直到當(dāng)前線程釋放該互斥鎖。如果釋放互斥鎖時(shí)有多個(gè)線程阻塞,所有在該互斥鎖上的阻塞線程都會(huì)變成可運(yùn)行狀態(tài),第一個(gè)變?yōu)檫\(yùn)行狀態(tài)的線程可以對(duì)互斥量加鎖,其它線程將會(huì)看到互斥鎖依然被鎖住,只能回去再次等待它重新變?yōu)榭捎?。在這種情況下,每次只有一個(gè)線程可以向前執(zhí)行。
二、信號(hào)量(semaphore)
互斥量只能用于一個(gè)資源的互斥訪問(wèn),它不能實(shí)現(xiàn)多個(gè)資源的多線程互斥問(wèn)題。信號(hào)量可以實(shí)現(xiàn)多個(gè)同類資源的多線程互斥和同步。當(dāng)信號(hào)量為單值信號(hào)量是,也可以完成一個(gè)資源的互斥訪問(wèn)。
三、讀寫(xiě)鎖
讀寫(xiě)鎖與互斥量類似,不過(guò)讀寫(xiě)鎖允許更高的并行性?;コ饬恳词擎i住狀態(tài)要么是不加鎖狀態(tài),而且一次只有一個(gè)線程可以對(duì)其加鎖。
讀寫(xiě)鎖可以由三種狀態(tài):讀模式下加鎖狀態(tài)、寫(xiě)模式下加鎖狀態(tài)、不加鎖狀態(tài)。一次只有一個(gè)線程可以占有寫(xiě)模式的讀寫(xiě)鎖,但是多個(gè)線程可以同時(shí)占有讀模式的讀寫(xiě)鎖。
在讀寫(xiě)鎖是寫(xiě)加鎖狀態(tài)時(shí),在這個(gè)鎖被解鎖之前,所有試圖對(duì)這個(gè)鎖加鎖的線程都會(huì)被阻塞。當(dāng)讀寫(xiě)鎖在讀加鎖狀態(tài)時(shí),所有試圖以讀模式對(duì)它進(jìn)行加鎖的線程都可以得到訪問(wèn)權(quán),但是如果線程希望以寫(xiě)模式對(duì)此鎖進(jìn)行加鎖,它必須阻塞直到所有的線程釋放讀鎖。雖然讀寫(xiě)鎖的實(shí)現(xiàn)各不相同,但當(dāng)讀寫(xiě)鎖處于讀模式鎖住狀態(tài)時(shí),如果有另外的線程試圖以寫(xiě)模式加鎖,讀寫(xiě)鎖通常會(huì)阻塞隨后的讀模式鎖請(qǐng)求。這樣可以避免讀模式鎖長(zhǎng)期占用,而等待的寫(xiě)模式鎖請(qǐng)求一直得不到滿足。
讀寫(xiě)鎖非常適合于對(duì)數(shù)據(jù)結(jié)構(gòu)讀的次數(shù)遠(yuǎn)大于寫(xiě)的情況。當(dāng)讀寫(xiě)鎖在寫(xiě)模式下時(shí),它所保護(hù)的數(shù)據(jù)結(jié)構(gòu)就可以被安全地修改,因?yàn)楫?dāng)前只有一個(gè)線程可以在寫(xiě)模式下?lián)碛羞@個(gè)鎖。當(dāng)讀寫(xiě)鎖在讀狀態(tài)下時(shí),只要線程獲取了讀模式下的讀寫(xiě)鎖,該鎖所保護(hù)的數(shù)據(jù)結(jié)構(gòu)可以被多個(gè)獲得讀模式鎖的線程讀取。
讀寫(xiě)鎖也叫做共享-獨(dú)占鎖,當(dāng)讀寫(xiě)鎖以讀模式鎖住時(shí),它是以共享模式鎖住的;當(dāng)他以寫(xiě)模式鎖住時(shí),它是以獨(dú)占模式鎖住的。
四、條件變量(condition)和監(jiān)視器(monitor)
條件變量與互斥量一起使用時(shí),允許線程以無(wú)競(jìng)爭(zhēng)的方式等待特定的條件發(fā)生。
條件本身是由互斥量保護(hù)的。線程在改變條件狀態(tài)前必須首先鎖住互斥量,其它線程在獲得互斥量之前不會(huì)察覺(jué)到這種改變,因此必須鎖定互斥量以后才能計(jì)算條件。
總結(jié)
以上是生活随笔為你收集整理的线程同步机制:互斥量、信号量、读写锁、条件变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 线程管理、同步机制等
- 下一篇: 最佳线程数总结(1