Kann man generell von Thread-Sicherheit ausgehenGet-Methoden wenn nicht anders in der Dokumentation einer Methode vermerkt? Oder ist es umgekehrt, dass man niemals Thread-Sicherheit annehmen sollte, wenn nicht anders angegeben? Was denkst du?
Bearbeiten:
Nimm eine Klasse an
class InfoClass {
public:
void Init();
int GetInfo();
void Free();
};
Berufung Init()
Einmal, GetInfo()
aus einem Thread-Kontext und Free()
nachdem die Threadoperationen beendet sind.
Antworten:
4 für die Antwort № 1Fadensicherheit immer erfordert zusätzliche Arbeit, so dass das einzige, was Sie sicher annehmen können, das Gegenteil ist - in Ermangelung einer direkten Unterstützung ist die Fadensicherheit nicht unterstützt.
Erläuterung:
Angenommen, Sie haben eine get
für ein einfaches 64-Bit long long
und laufen auf einer 32-Bit-Architektur. Während der Computer die zweite Hälfte dieses langen 64-Bit-Werts abruft (was gerade mit der ersten Hälfte erledigt wurde), aktualisiert ein anderer Thread die zweite Hälfte.
Bearbeiten (um die Bearbeitung in der Frage zu treffen):
(Randbemerkung - die Art und Weise, wie Sie Ihre Klasse präsentiert haben, macht sie unbrauchbar, da alle Mitglieder privat sind)
Wenn du nicht hast irgendein Zugriffsmethoden, die den Status Ihrer Klasse ändern, nachdem sie erstellt wurde kann Thread-Sicherheit voraussetzen. Aber es ist immer noch eine schlampige Steigung, denn später kann jemand, der Ihre Annahme nicht kennt, eine hinzufügen set
in der Klasse und haben eine wunderbare Reise in einem Fehler-Fehler-Debugging-Erlebnis;)
4 für die Antwort № 2
Ich denke, Sie sollten davon ausgehen, dass die Methode ist not thread-safe
wenn nicht anders gesagt
Eigentlich sehe ich keinen Grund anzunehmen, dass eine Methode ist thread-safe
standardmäßig.
2 für die Antwort № 3
Eine get-Methode könnte Thread-sicher sein, aber auch nicht unbedingt. Wenn es eine Klasse gibt:
class A {
int value;
int getValue() {
return value;
}
void processValue() {
value += 2;
value = value*2;
}
}
In dem obigen Code getValue
ist offensichtlich nicht threadsicher, da es aufgerufen werden könnte, wenn sich ein anderer Thread in der zweiten Zeile befindet processValue
und damit die Variable value
in einem inkonsistenten Zustand sein. Der Getter hier ist also erneut eintritt (wiederum ist dies möglicherweise nicht so), aber immer noch nicht Thread-sicher.
Wie bereits in diesem Thread erwähnt, wird, sofern nicht anders angegeben, davon ausgegangen, dass es nicht threadsicher ist.
0 für die Antwort № 4
Wenn die Variable mit aktualisiert wird set
Methode, wenn Sie anrufen get
Methode das Ergebnis wird Müll sein. Wenn nichts anderes angegeben ist, kann keine Gewindesicherheit angenommen werden.