2016-04-08 37 views
1

我有一個靜態功能的C++類:我需要一個靜態函數的互斥量嗎?

class Foo 
{ 
public: 
    static void bar(int &a) 
    { 
     a++; 
    } 
} 

編輯:
作爲參數傳遞的變量僅主叫範圍內使用。所以它不被另一個線程訪問。

當我從一個單獨的線程調用這個函數時,我必須使用mutex嗎?

謝謝。

+1

取決於'a'在別處如何使用。 a'可以是任何'int'嗎?如果它可以是任何東西,你如何正確地保護它?在調用'bar'之前,你可能需要使用你的鎖。 – Simple

+0

答案相當複雜,除非您可以提供有關如何使用此功能的更多信息。傳入此函數的變量需要保護,而不是函數本身。 – Galik

+0

@Galik:你的第二句反駁你的第一句,因爲這個問題的答案非常簡單。 –

回答

8

調用此函數只需要線程本地資源,即線程堆棧。因此答案是否定的。如果int變量可以通過多於調用線程訪問,則將需要一個mutex用於變量

3

函數是否爲static對於是否需要對其調用進行同步沒有任何影響。

決定性因素是函數是否可重入以及您對數據做了什麼。在這種情況下,函數重入(因爲它本身沒有非本地狀態,或者實際上沒有任何狀態),並且數據由調用範圍擁有/管理,因此您將擁有在調用範圍內決定該整數是否需要保護。

但是,無論bar是靜態成員,非靜態成員,自由函數,宏,貓還是黑洞,還是Jon Skeet的滾筒式烘乾機,都是如此。

+0

只是好奇。你爲什麼改變你的名字而不是回覆它? – SergeyA

+0

我知道。並不意味着它在一夜之間翻轉過來。問題依然存在。 – SergeyA

+0

夠公平的。就像我說的,只是好奇。 – SergeyA

0

我想提一下,互斥量不是唯一可用的線程同步原語,在某些情況下遠離最合適的線程同步原語。

需要提供同步(請參閱另外兩個關於爲什麼需要根據使用情況需要的答案),請勿進入互斥體世界。對於像計數器那樣直截了當的東西(這是我在代碼中看到的)原子變量(或者在沒有這些變量的情況下,對非原子類型進行原子操作)通常會提供更好的性能和更直接​​的代碼。

在這種特殊情況下,增加一個變量可以很容易地在線程安全的方式完成與下面的C++代碼11:

static void bar(std::atomic<int>& a) 
{ 
    a.fetch_add(1, std::memory_order_relaxed); 
} 

這裏使用memory_order_relaxed實在是牽強的,而不是neccessarily適用(然而,對於櫃檯來說通常是好的)。這裏主要用於這個例子。

相關問題