2010-12-22 130 views
10

在C++中,當你在靜態成員函數中有局部變量時,這是否意味着這些局部變量也是隱式靜態的或者它們真的是本地變量?靜態成員函數和線程安全

例如:

static void myClass::somefunc(int someint) 
{ 

int myint = someint; // is myint really a local variable or does it change due to the static qualifier at function level? 


} 

此外,運行此功能的線程池不同的線程,並敏需要用鎖來保護?假定傳遞給它的所有值都是不同的並且彼此沒有關係。

編輯:謝謝你的答案。現在如果我通過了boost::shared_ptr<T>,知道這個對象不會被另一個線程同時使用,那該怎麼辦? (不知道是否真的可以保證,或者你可以嗎?)

我想一個原始的ptr通過,需要一些保護,如果它被全部使用?

+1

你被靜電有兩種完全不同的含義混淆。你並不孤單,這也許是爲什麼獨立函數中的靜態現在已被棄用的原因。 – Suma 2010-12-22 15:17:19

回答

8

除非你聲明它們,否則它們是本地的static - 函數的每個調用都有自己的變量副本,並且你不需要保護它們。

+6

@ T33C:他在哪裏有一個`靜態`本地我想知道? – sharptooth 2010-12-22 14:25:10

1

myintsomefunc的本地代碼,無需跨線程保護。

1

myint在你的例子中是一個局部變量,每次somefunc被稱爲myint生命。但不會超過這個。

敏並不需要被保護,因爲它是一個局部變量

1

myint將真正是本地的。你不必擔心保護它。對於內存中的每個函數調用,將在棧上爲myint創建單獨的空間。

1

myint變量將保持本地,沒有必要保護它們,因爲每個線程不會共享本地變量。

1

靜態關鍵字意味着該函數不會傳遞一個隱藏的「this」 參數。此外,該函數將無法訪問類實例數據。 函數的靜態限定符對函數的本地數據沒有影響。

static RetType SomeClass::SomeMethod(Type arg)具有相同的「類型」爲免費功能RetType SomeFunc(Type arg)

問候,
馬辛