2016-02-28 32 views
0

爲什麼我會使用unique_lock<>包裝?我爲什麼要使用unique_lock <>包裝器?

我有時會看到這樣的

std::unique_lock<std::mutex> lock(m_active_sessions_guard); // lock() the associated mutex 
m_active_sessions[request_id] = session; 
lock.unlock(); 

其中創建unique_lock<>代碼只是鎖定關聯的互斥鎖。

經過搜索,我發現這個類是不可複製的。這是使用它的唯一好處嗎?

回答

1

考慮以下代碼:

int func() 
{ 
    m_active_sessions_guard.lock(); 
    ... some code ... 
    if (x > y) 
    { 
     return -1; 
    } 
    ... some more code ... 
    m_active_sessions_guard.lock(); 
    return 1; 
} 

我們在早期的回報 「忘記」 了unlockx > y是真實的。這可能會導致我們的程序死鎖,或者(更糟糕的是)會導致程序以其他方式緩慢/不正常地運行。

通過使用在調用析構函數時自動解鎖鎖的類型,可以保證您不會「忘記」解鎖鎖EVER。我肯定花了好幾個小時來尋找這樣的問題,我不希望任何人 - 尤其是那些觸發鎖定或運行緩慢的情況只發生一次的情況,所以甚至「抓住」失敗你必須是幸運的(也許x > y只發生在星期四,幾個月沒有「r」,並且日期可以被7和3整除。所以如果你不幸在四月底得到錯誤報告,你「會來調試了一段時間... :)

的基礎是RAII(‘資源分配即初始化’),這是相同的邏輯,爲什麼要使用std::vector而不是指針,並呼籲new/delete自己。任何時候你都可以讓編譯器爲你完成這項工作,你有很大的好處:「不必記住」。計算機程序,如編譯器,非常擅長「記憶」事物。

相關問題