第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何兩次解鎖互斥體

如何兩次解鎖互斥體

Go
MMTTMM 2023-07-17 15:25:08
兩次解鎖互斥體是否安全?我的代碼:var m sync.RWMutex = sync.RWMutex{}func Read() {    m.RLock()    defer m.RUnlock()    // Do something that needs lock    err := SomeFunction1()    if err != nil {        return    }    m.RUnlock()    // Do something that does not need lock    SomeFunction2()}我需要defer m.RUnlock()案例SomeFunction1()返回錯誤。但是當(dāng)SomeFunction1()返回沒有錯誤時,m會被m.RUnlock()和解鎖兩次defer m.RUnlock()。兩次解鎖互斥體是否安全?如果沒有,我應(yīng)該如何修復(fù)我的代碼?
查看完整描述

3 回答

?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗 獲得超12個贊

兩次解鎖互斥體是否安全?

不,你不應(yīng)該兩次解鎖互斥體。根據(jù)文檔,這是一個運(yùn)行時錯誤

RUnlock 撤消單個 RLock 調(diào)用;它不會影響其他同時閱讀的讀者。如果 rw 在進(jìn)入 RUnlock 時未鎖定以進(jìn)行讀取,則這是一個運(yùn)行時錯誤。


如果沒有,我應(yīng)該如何修復(fù)我的代碼?

我建議保留defer但僅m.RUnlock()在發(fā)生錯誤時才保留。如果您在SomeFunction1()和之間添加更多函數(shù)調(diào)用,這可以輕松擴(kuò)展SomeFunction2()。

func Read() {

? ? var err error

? ? m.RLock()

? ? defer func() {

? ? ? ? if err != nil {

? ? ? ? ? ? m.RUnlock()

? ? ? ? }

? ? }()

? ??


? ? // Do something that needs lock

? ? err = SomeFunction1()

? ? if err != nil {

? ? ? ? return

? ? }


? ? m.RUnlock()


? ? // Do something that does not need lock

? ? SomeFunction2()

}

在Go Playground上試試吧!



查看完整回答
反對 回復(fù) 2023-07-17
?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊

解鎖未鎖定的互斥鎖會導(dǎo)致恐慌。


您可以簡單地刪除defer并將其添加到 if 條件中:


var m sync.RWMutex = sync.RWMutex{}


func Read() {

    m.RLock()


    // Do something that needs lock

    err := SomeFunction1()

    if (err != nil) {

        m.RUnlock()

        return

    }


    m.RUnlock()


    // Do something that does not need lock

    SomeFunction2()

}

或者甚至更好(對可讀性影響較?。?/p>


func Read() {

    m.RLock()


    err := SomeFunction1()

    m.RUnlock()

    if (err != nil) {

        return

    }


    SomeFunction2()

}


查看完整回答
反對 回復(fù) 2023-07-17
?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗 獲得超4個贊

來自戈多克:


如果 m 在進(jìn)入 Unlock 時未鎖定,則會發(fā)生運(yùn)行時錯誤。


所以,不要這樣做。


最簡單的解決方法是不使用延遲解鎖,而是在每個可能的出口處解鎖?;蛘?,你也可以這樣做,但不太容易閱讀:


func Read() {

    if err := func() {

      m.RLock()

      defer m.RUnlock()


      // Do something that needs lock

      err := SomeFunction1()

      if err != nil {

          return err

      }(); err != nil {

        return err

     }


    // Do something that does not need lock

    SomeFunction2()


}


查看完整回答
反對 回復(fù) 2023-07-17
  • 3 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號