2010-12-22 14 views
10

In C++, wenn Sie lokale Variablen in einer statischen Elementfunktion haben, bedeutet dies, dass diese lokalen Variablen auch implizit statisch sind oder sind sie wirklich lokal?statische Member-Funktion und Thread-Sicherheit

Beispiel:

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? 


} 

Auch verschiedene Threads von einem Thread-Pool diese Funktion ausgeführt wird, wird myint müssen durch eine Sperre geschützt werden? angenommen, dass alle Werte, die an sie übergeben werden, unterschiedlich sind und keine Beziehung zueinander haben.

EDIT: Vielen Dank für die Antworten. Was nun, wenn ich in einer boost::shared_ptr<T> übergeben, wissen, dass dieses Objekt nicht gleichzeitig von einem anderen Thread verwendet werden würde? (Nicht sicher, ob man das wirklich garantieren kann, oder können Sie?)

Ich vermute, dass ein rohes PTR reingereicht wurde, würde etwas Schutz benötigen, wenn es überall verwendet würde?

+1

Sie verwirrt wird durch statische mit zwei völlig unterschiedlichen Bedeutungen. Sie sind nicht allein, weshalb die statische Funktion einer eigenständigen Funktion möglicherweise veraltet ist. – Suma

Antwort

8

Sie sind lokal, es sei denn, Sie deklarieren sie static - jeder Aufruf der Funktion wird seine eigene Kopie der Variablen haben, und Sie müssen sie nicht schützen.

+6

@ T33C: Wo hat er eine 'statische' lokale ich frage mich? – sharptooth

+1

Manche Leute scheinen 'statische Funktionen' mit' statischen lokalen Variablen' zu verwechseln, während zwischen ihnen praktisch keine Beziehung besteht. –

+1

@ T33C: Sie liegen falsch. Die Variable ist offensichtlich nicht statisch (selbst wenn die Funktion ist). Entfernen Sie Ihre -1 –

1

myint ist lokal für somefunc und Sie müssen es nicht über Threads schützen.

1

myint in Ihrem Beispiel ist eine lokale Variable, jedes Mal, wenn eine Funktion namens myint lebt. aber nicht mehr als das.

myint muss nicht geschützt werden, weil seine eine lokale Variable

1

myint wirklich lokal sein wird. Sie müssen sich keine Sorgen machen, es zu schützen. Für jeden einzelnen Funktionsaufruf im Speicher wird ein separater Speicherbereich für myint auf dem Stack erstellt.

1

Die myint Variable bleibt lokal, es ist nicht notwendig, sie zu schützen, da jeder Thread die lokalen Variablen nicht teilt.

1

Das statische Schlüsselwort bedeutet, dass die Funktion kein verstecktes "dieses" Argument übergeben wird. Außerdem hat die Funktion keinen Zugriff auf die Klasseninstanzdaten. Das statische Qualifikationsmerkmal der Funktion hat keinen Einfluss auf die lokalen Daten der Funktion.

Die static RetType SomeClass::SomeMethod(Type arg) hat den gleichen „Typen“ als freie Funktion RetType SomeFunc(Type arg)

Regards,
Marcin

Verwandte Themen