我有一個靜態功能的C++類:我需要一個靜態函數的互斥量嗎?
class Foo
{
public:
static void bar(int &a)
{
a++;
}
}
編輯:
作爲參數傳遞的變量僅主叫範圍內使用。所以它不被另一個線程訪問。
當我從一個單獨的線程調用這個函數時,我必須使用mutex
嗎?
謝謝。
我有一個靜態功能的C++類:我需要一個靜態函數的互斥量嗎?
class Foo
{
public:
static void bar(int &a)
{
a++;
}
}
編輯:
作爲參數傳遞的變量僅主叫範圍內使用。所以它不被另一個線程訪問。
當我從一個單獨的線程調用這個函數時,我必須使用mutex
嗎?
謝謝。
調用此函數只需要線程本地資源,即線程堆棧。因此答案是否定的。如果int變量可以通過多於調用線程訪問,則將需要一個mutex
用於變量
函數是否爲static
對於是否需要對其調用進行同步沒有任何影響。
決定性因素是函數是否可重入以及您對數據做了什麼。在這種情況下,函數是重入(因爲它本身沒有非本地狀態,或者實際上沒有任何狀態),並且數據由調用範圍擁有/管理,因此您將擁有在調用範圍內決定該整數是否需要保護。
但是,無論bar
是靜態成員,非靜態成員,自由函數,宏,貓還是黑洞,還是Jon Skeet的滾筒式烘乾機,都是如此。
我想提一下,互斥量不是唯一可用的線程同步原語,在某些情況下遠離最合適的線程同步原語。
需要提供同步(請參閱另外兩個關於爲什麼需要根據使用情況需要的答案),請勿進入互斥體世界。對於像計數器那樣直截了當的東西(這是我在代碼中看到的)原子變量(或者在沒有這些變量的情況下,對非原子類型進行原子操作)通常會提供更好的性能和更直接的代碼。
在這種特殊情況下,增加一個變量可以很容易地在線程安全的方式完成與下面的C++代碼11:
static void bar(std::atomic<int>& a)
{
a.fetch_add(1, std::memory_order_relaxed);
}
這裏使用memory_order_relaxed
實在是牽強的,而不是neccessarily適用(然而,對於櫃檯來說通常是好的)。這裏主要用於這個例子。
取決於'a'在別處如何使用。 a'可以是任何'int'嗎?如果它可以是任何東西,你如何正確地保護它?在調用'bar'之前,你可能需要使用你的鎖。 – Simple
答案相當複雜,除非您可以提供有關如何使用此功能的更多信息。傳入此函數的變量需要保護,而不是函數本身。 – Galik
@Galik:你的第二句反駁你的第一句,因爲這個問題的答案非常簡單。 –