Locks


與鎖有關(guān)的操作

  • Acquire() :在進(jìn)入臨界區(qū)前調(diào)用

  • Release():在離開臨界區(qū)后調(diào)用

    有的操作系統(tǒng)可能會(huì)用```Lock()/Unlock()```來代替
    
  • Acquire()Release()之間垒玲,線程將一直占有這個(gè)鎖修然。只有當(dāng)占有鎖的線程釋放鎖的時(shí)候,線程才能獲得鎖二庵。

  • Acquire()Release()一定是成對(duì)出現(xiàn)的。


一個(gè)簡(jiǎn)單的鎖的使用
應(yīng)用在銀行取款:

withdraw(account, amount) {
    acquire(lock);
    balance = get_balance(account);
    balance = balance - amount;
    put_balance(account, balance);
    release(lock);
    return balance;
}

鎖可以是自旋的(a spinlock)佛嬉,也可以是阻塞的(a mutex)



那如何實(shí)現(xiàn)自旋鎖呢镰惦?

  • 實(shí)現(xiàn)一:
struct lock{
int held = 0;
}
void acquire(lock) {
   while(lock->held);
   lock->held = 1;
}
void release(lock){
   lock->held = 0;
}

之所以被稱為自旋鎖,是因?yàn)榫€程在鎖沒有被釋放的時(shí)候并不會(huì)進(jìn)入睡眠狀態(tài)镰吵,而是不停地檢查鎖是否被釋放了檩禾。
但這樣的實(shí)現(xiàn)是存在問題的。因?yàn)閮蓚€(gè)自旋中的線程可能同時(shí)發(fā)現(xiàn)held變成了0疤祭,而跳出循環(huán)盼产。

  • 實(shí)現(xiàn)一給我們的啟示:
  • 在實(shí)現(xiàn)一中lock->held其實(shí)是一個(gè)新的共享變量,會(huì)帶來新的臨界區(qū)勺馆。這樣無限循環(huán)戏售,無法解決問題侨核。
  • Acquire()Release()操作必須是原子的。

那么又該如何實(shí)現(xiàn)原子操作呢蜈项?
我們需要硬件的支持:

  • 一些原子的指令(如:test-and-set指令)
  • test-and-set的語(yǔ)義:

①記錄舊值
②將值設(shè)置為TRUE
③返回舊值

  • 對(duì)應(yīng)的代碼(硬件原子地完成如下的工作):
bool test_and_set (bool *flag) {
   bool old = *flag;
   *flag = TRUE;
   return old;
}
  • 這是由硬件自動(dòng)實(shí)現(xiàn)的
  • Swap/SCHG指令
    void Swap (char* x,* y) { // All done atomically
        char temp = *x;
        *x = *y;
        *y = temp
    }
    
  • 使用Swap實(shí)現(xiàn)test-and-set
     bool test_and_set (bool *flag) {
      bool X = TRUE;
      Swap(&X, &flag);
      return X;
    }
    
- 開關(guān)中斷
- 對(duì)應(yīng)代碼:
 ```
 structlock { };
 void acquire (lock) {
     disable interrupts;
 }
 void release (lock) {
     enable interrupts;
 }
 ```
- 開關(guān)中斷在實(shí)際系統(tǒng)中是不具有可行性的芹关。因?yàn)樵趯?shí)際系統(tǒng)中,只有kernel才有資格開關(guān)中斷紧卒,而且隨意開關(guān)中斷也會(huì)導(dǎo)致很多嚴(yán)重的后果侥衬。所以只有在很高要求的同步才會(huì)使用中斷。
- 在有多處理器時(shí)跑芳,關(guān)中斷也是不足夠的

---
**根據(jù)上述實(shí)現(xiàn)的自旋鎖**
根據(jù)test-and-set指令:

struct lock {
int held = 0;
}
void acquire(lock) {
while(test_and_set(&lock->held);
}
void release(lock) {
lock->held = 0;
}

- 只有當(dāng)一開始```lock->held == 0```的時(shí)候才不會(huì)進(jìn)入忙等
- 這在多處理器上也是可行的轴总!
**因?yàn)橥瑫r(shí)只有一個(gè)CPU可以占有內(nèi)存總線,只有一個(gè)CPU能夠讀到```lock->held == 0```的情況**

---
**自旋鎖存在的問題**
- 使用自旋鎖會(huì)使得線程在占用CPU的時(shí)候博个,只是在不停地忙等而不做任何事情怀樟。所以是開銷很大的。
- 解決方法:
  - 沒有鎖就主動(dòng)thread_yield()盆佣,來下CPU
  - 沒有鎖就進(jìn)入睡眠狀態(tài)往堡,直到可以的時(shí)候再上CPU

---
**在鎖的使用中可能存在如下問題:**
- 臨界區(qū)可能很長(zhǎng),其他線程可能等待的時(shí)間很長(zhǎng)共耍,而且持有鎖的線程隨時(shí)可能下CPU虑灰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痹兜,隨后出現(xiàn)的幾起案子穆咐,更是在濱河造成了極大的恐慌,老刑警劉巖字旭,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对湃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遗淳,警方通過查閱死者的電腦和手機(jī)拍柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲脂,“玉大人斤儿,你說我怎么就攤上這事】纸酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵疆液,是天一觀的道長(zhǎng)一铅。 經(jīng)常有香客問我,道長(zhǎng)堕油,這世上最難降的妖魔是什么潘飘? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任肮之,我火速辦了婚禮,結(jié)果婚禮上卜录,老公的妹妹穿的比我還像新娘戈擒。我一直安慰自己,他們只是感情好艰毒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布筐高。 她就那樣靜靜地躺著,像睡著了一般丑瞧。 火紅的嫁衣襯著肌膚如雪柑土。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天绊汹,我揣著相機(jī)與錄音稽屏,去河邊找鬼。 笑死西乖,一個(gè)胖子當(dāng)著我的面吹牛狐榔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播获雕,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薄腻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了典鸡?” 一聲冷哼從身側(cè)響起被廓,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萝玷,沒想到半個(gè)月后嫁乘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡球碉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蜓斧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睁冬。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挎春,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豆拨,到底是詐尸還是另有隱情直奋,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布施禾,位于F島的核電站脚线,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥搞。R本人自食惡果不足惜邮绿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一渠旁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧船逮,春花似錦顾腊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冠骄,卻和暖如春伪煤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凛辣。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工抱既, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扁誓。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓防泵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蝗敢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捷泞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容