Wenn Sie über Cocoa sprechen, wird die Mutex-Funktionalität dort von NSLock
y NSRecursiveLock
.
Um nicht-atomare Ressourcen ordnungsgemäß zu schützen, benötigen Sie diese Mutexe, damit nicht mehrere Threads gleichzeitig versuchen, die Daten zu ändern (was zu Korruption führt) oder die Daten in einem halbgeänderten Zustand zu verwenden (was zu ungültigen Daten führt).
Ihr Code würde etwa so aussehen:
static NSLock session_id_lock;
static unsigned int session_id = 1000;
- (int) generateSessionID{
int new_id;
[myLock lock];
new_id = session_id++;
[myLock unlock];
return new_id;
}
Wenn Sie kein Cocoa verwenden (oder das bisschen Cocoa-Programmierung, an das ich mich von meinem kurzen Zwischenspiel mit einem iMac erinnere, ist so schwach, dass es fast nutzlos ist), verwenden Sie einfach das Konzept und übersetzen Sie es in eine beliebige Sprache oder ein beliebiges Framework, das Sie haben:
- sperren Sie den Mutex, bevor Sie eine geschützte Ressource verwenden oder ändern.
- die Ressource zu nutzen oder zu verändern.
- den Mutex entsperren.
- Bonustipp 1: Sperren Sie den Mutex so spät wie möglich und heben Sie ihn so bald wie möglich wieder auf.
- Bonustipp 2: Schließen Sie nur ab, was Sie brauchen, um unnötige Verzögerungen zu vermeiden.
Um den letzten Punkt weiter zu erläutern: Wenn Sie die Synchronisierung auf self
für zwei völlig unverbundene Dinge (z. B. eine Sitzungs-ID und eine Benutzer-ID), blockieren sie sich gegenseitig, obwohl dies nicht notwendig ist. Ich würde zwei separate Mutexe bevorzugen, um die Granularität niedrig zu halten.
Wenn Sie natürlich nur eine Mutex auf die Sitzungs-ID allein haben (aber siehe unten), können Sie auch synchronized(self)
aber ich würde es lieber auf meine Art machen, damit ich nicht später eine weitere geschützte Ressource hinzufügen muss.
In jedem Fall (dies ist der erwähnte Vorbehalt) werden Sie wahrscheinlich feststellen, dass die Synchronisierung auf self
würde eine statische Variable, die von mehreren Objekten gemeinsam genutzt wird, nicht ausreichend schützen. Der Mutex sollte zum Daten als derjenige, der es verwendet.