linux線程間的同步與互斥知識(shí)點(diǎn)總結(jié)
在線程并發(fā)執(zhí)行的時(shí)候,我們需要保證臨界資源的安全訪問(wèn),防止線程爭(zhēng)搶資源,造成數(shù)據(jù)二義性。
線程同步: 條件變量
為什么使用條件變量?
對(duì)臨界資源的時(shí)序可控性,條件滿足會(huì)通知其他等待操作臨界資源的線程,類似信號(hào)。 場(chǎng)景:T-DAY展會(huì)排隊(duì)參觀/生產(chǎn)者消費(fèi)者模型
條件變量是什么?
是一種同步機(jī)制,一個(gè)線程用于修改這個(gè)變量使其滿足其它線程繼續(xù)往下執(zhí)行的條件,其它線程則接收條件已經(jīng)發(fā)生改變的信號(hào)。
條件變量操作?
初始化和銷毀
pthread_cond_wait
條件不滿足 會(huì)釋放鎖并阻塞等待 , 這個(gè)函數(shù)是原子性操作:1.將線程放入條件等待隊(duì)列 2.釋放鎖
條件滿足 則線程會(huì)被喚醒并加鎖
pthread_cond_signal 一對(duì)一喚醒
喚醒等待隊(duì)列中的一個(gè)線程
pthread_cond_broadcast 廣播喚醒
喚醒等待隊(duì)列中的全部線程
為什么等待和解鎖需要原子操作/為什么條件變量要使用互斥鎖?
因?yàn)閜thread_cond_wait中的鎖是為了保護(hù)條件變量,防止錯(cuò)過(guò)信號(hào),如果等待解鎖不是原子性操作,比如線程A先解鎖,此時(shí)CPU時(shí)間片切換到線程B,線程B加鎖并發(fā)送條件變量信號(hào),此時(shí)再切換到線程A,線程A還來(lái)不及等待就錯(cuò)過(guò)了信號(hào),就可能會(huì)永久阻塞下去。所以,等待和解鎖必須是原子性操作。
為什么需要while循環(huán)判斷臨界資源是否存在?
在一對(duì)多的情況下,生產(chǎn)者發(fā)送一個(gè)信號(hào),等待的線程被喚醒并加鎖,但是只有一個(gè)線程能加鎖,其他線程就會(huì)阻塞等待鎖,如果這個(gè)線程用完了臨界資源,其他線程不進(jìn)行判斷就繼續(xù)往下走,是不合理的。
singnal要先解鎖還是后解鎖?
如果先解鎖,鎖被沒(méi)有阻塞等待的線程拿到了,再把臨界資源使用了,解鎖后的singal就沒(méi)意義了,也就是虛假喚醒;
先singal喚醒,再讓喚醒的線程爭(zhēng)搶鎖,在linux下,有兩個(gè)隊(duì)列,一個(gè)是cond_wait,一個(gè)是mutex_lock,singal只是讓cond_wait上的線程轉(zhuǎn)移到mutex_lock,不會(huì)返回用戶空間,這樣能提高效率。
線程互斥: 互斥鎖
為什么使用互斥鎖?
對(duì)臨界資源同時(shí)間唯一訪問(wèn),保護(hù)臨界資源防止修改。 場(chǎng)景:黃牛搶票
互斥鎖是什么?
是一個(gè)0/1計(jì)數(shù)器,1代表有資源能操作,0代表沒(méi)有資源可以操作。
互斥鎖操作?
初始化和銷毀
加鎖---如果計(jì)數(shù)為1,置0,進(jìn)行需要的操作;如果計(jì)數(shù)為0,則阻塞等待計(jì)數(shù)變?yōu)?
解鎖---計(jì)數(shù)置為1
以上就是本次介紹的全部相關(guān)知識(shí)點(diǎn),感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
相關(guān)文章
Linux系統(tǒng)修改環(huán)境變量的常用方法
這篇文章主要給大家介紹了Linux系統(tǒng)修改環(huán)境變量的常用方法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02Linux+php+apache+oracle環(huán)境搭建之CentOS下安裝Oracle數(shù)據(jù)庫(kù)
研究了兩天Linux下安裝Oracle,重裝了兩次虛擬機(jī),終于安裝成功。很有收獲的。記錄下安裝過(guò)程。大神們?nèi)缬懈玫姆绞?,?qǐng)聯(lián)系我!2014-08-08搭建自己的個(gè)人服務(wù)器(個(gè)人電腦公網(wǎng)訪問(wèn)配置篇)
搭建自己的個(gè)人服務(wù)器,主要涉及服務(wù)器上的防火墻和端口權(quán)限、路由器端口轉(zhuǎn)發(fā)、端口映射等,需要的朋友可以參考下2023-08-08Linux下SVN服務(wù)器自動(dòng)更新文件到Web目錄的方法
這篇文章主要介紹了Linux下SVN服務(wù)器自動(dòng)更新文件到Web目錄的方法,需要的朋友可以參考下2015-07-07