2016-04-08 8 views
1

Ich habe eine C++ Klasse mit einer statischen Funktion:Benötige ich einen Mutex für eine statische Funktion?

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

EDIT:
Die Variable als Argument übergibt nur im Aufruf Umfang verwendet wird. Es wird also nicht von einem anderen Thread zugegriffen.

Muss ich eine mutex verwenden, wenn ich diese Funktion von einem separaten Thread aufrufen?

Danke.

+1

Hängt davon ab, wie 'a' an anderer Stelle verwendet wird. Kann 'a' irgendein' int' sein? Wie schützt man es richtig, wenn es etwas sein kann? Wahrscheinlich müssen Sie Ihre Sperre verwenden, bevor Sie 'bar' aufrufen. – Simple

+0

Die Antwort ist ziemlich komplex, es sei denn, Sie können weitere Informationen darüber zur Verfügung stellen, wie diese Funktion verwendet wird. Die Variablen, die an diese Funktion übergeben werden, müssen geschützt werden und nicht die Funktion selbst. – Galik

+0

@Galik: Dein zweiter Satz widerlegt deine erste, in der die Antwort auf diese Frage sehr einfach ist. –

Antwort

8

Der Aufruf dieser Funktion erfordert nur Thread-lokale Ressourcen, den Stapel von Thread. Daher lautet die Antwort nein. Wenn auf die Variable int mehr als der aufrufende Thread zugreifen kann, benötigen Sie mutex für die Variable

3

Ob eine Funktion static ist, hat keinen Einfluss darauf, ob Aufrufe an sie synchronisiert werden müssen.

Der entscheidende Faktor ist, ob die Funktion einspringt und was Sie mit den Daten tun. In diesem Fall ist die Funktion einspringend (da sie keinen eigenen lokalen Status oder überhaupt keinen Status hat), und die Daten werden von dem aufrufenden Bereich verwaltet/verwaltet innerhalb des aufrufenden Bereichs zu entscheiden, ob diese Ganzzahl Schutz benötigt.

Aber das ist wahr, ob bar ist ein statisches Mitglied, ein nicht-statisches Mitglied, eine freie Funktion, ein Makro, eine Katze, ein schwarzes Loch oder Jon Skeet Wäschetrockner.

+0

Nur neugierig. Warum hast du deinen Namen geändert und ihn dann wieder zurückgesetzt? – SergeyA

+0

Ich weiß. Nicht implizieren, dass es über Nacht umgedreht wurde. Die Frage steht noch. – SergeyA

+0

Fair genug. Wie ich schon sagte, nur neugierig sein. – SergeyA

0

Ich möchte erwähnen, dass Mutex nicht das einzige verfügbare Grundelement der Thread-Synchronisation ist und in einigen Szenarien weit davon entfernt ist.

Sofern eine Synchronisation erforderlich ist (siehe zwei andere Antworten, warum dies je nach Verwendung erforderlich sein könnte), sollten Sie nicht in die Mutex-Welt springen. Für etwas so genau wie ein Zähler (das ist, was ich in dem Code sehe) atomare Variablen (oder, in Ermangelung dieser, atomare Operationen auf nicht-atomare Typen) bieten oft eine bessere Leistung und einfacher Code.

In diesem speziellen Fall eine variable Erhöhen leicht in Thread-sichere Art und Weise getan werden kann, mit folgenden 11 C++ Code:

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

memory_order_relaxed hier verwendet wird, ist wirklich weit hergeholt, und müssen nicht zwangsläufig anwendbar (jedoch oft gut für Zähler). Verwendet hier hauptsächlich für das Beispiel.

Verwandte Themen