簡體   English   中英

帶有靜態互斥鎖的static lock_guard嗎?

[英]static lock_guard with static mutex too?

因此,我需要進行一些線程不安全的函數調用,以確保線程安全,因此我嘗試使用std::mutexstd::lock_guard 當前代碼如下:

int myFunc(int value){
    static std::mutex m;
    std::lock_guard lock(m);
    auto a = unsafe_call(value);
    return a;
}

unsafe_call()是線程不安全的函數。 我還在互斥對象周圍放置了靜態對象,因為這樣,對於每個單獨的調用,該函數將具有不同的互斥對象。

我想知道的是,我也應該使lock_guard靜態對象,因為互斥體是靜態對象,正如我的一位同事告訴我的那樣。 我不知道為什么要這樣做,因為我認為lock_guard是一個簡單的.lock().unlock()調用,但是同事的建議使我感到困惑。

我也應該使lock_guard靜態,因為互斥體是靜態的,正如我的一位同事告訴我的那樣。

您的同事是完全錯誤的, lock_guard正在使用RAII機制控制資源(在這種情況下為互斥體),並且使其變為靜態將完全破壞其目的-互斥體在函數第一次執行時將被鎖定一次,並且僅在程序終止時才釋放,即實際上,您根本不會使用互斥鎖。

我也應該使lock_guard靜態,因為互斥體是靜態的,正如我的一位同事告訴我的那樣。

沒有

考慮兩個線程進入您的函數並且都獲得相同的static std::mutex m 一種嘗試鎖定它,另一種則沒有機會[1]。 此外,當第一個函數退出時,由於lock_guard是靜態存儲,並且它的作用域在此處有效,因此不會真正解鎖互斥鎖,因此不會調用析構函數。

[1] -std :: lock_guard鎖定ctor,如果guard是靜態的,則只會執行一次,第二個線程甚至不會嘗試鎖定 -由@Slava在注釋中更正。

我不知道為什么要這樣做,因為我認為lock_guard是一個簡單的.lock().unlock()調用,但是同事的建議使我感到困惑。

那個建議是毫無意義的IMO,您理所當然地對此感到困惑。

std::lock_guard的目的是在特定范圍內保證鎖定/解鎖互斥體(並且對異常具有魯棒性)。 這是通過使用析構函數的行為來完成的,可以保證在離開變量范圍時會調用它。
對於static變量,析構函數最多將在進程生命周期的結尾被調用。 因此,互斥鎖將在整個過程中被第一個調用線程鎖定。

全局范圍不太可能是正確/有意義的,因為它將與static lock_guard一起出現。

所以你的同事錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM