Gibt es eine Möglichkeit in objective C, dass ich einen statischen int definieren kann, der threadsicher ist?
zum Beispiel, wenn ich eine Klasse namens Session habe, die folgendes hat:
%Vor%Ich baue Session-Objekte aus verschiedenen Threads, jedem Session-Objekt sollte eine eindeutige ID haben.
Wenn Sie Cocoa sprechen, wird die Mutex-Funktionalität von NSLock
und NSRecursiveLock
bereitgestellt.
Um nicht atomare Ressourcen ordnungsgemäß zu schützen, benötigen Sie diese Mutexe, damit mehrere Threads möglicherweise nicht versuchen, die Daten gleichzeitig zu ändern (was zu einer Beschädigung führt) oder die Daten in einem halb geänderten Zustand verwenden (was zu ungültigen Ergebnissen führt) Daten).
Ihr Code würde etwa so aussehen:
%Vor%Wenn Sie nicht Cocoa verwenden (oder die kleine Cocoa-Programmierung, an die ich mich aus meinem kurzen Zwischenspiel mit einem iMac erinnere, ist so schwach daran erinnert, dass sie fast nutzlos ist), verwenden Sie einfach das Konzept und übersetzen es in die Sprache oder das Framework, das Sie haben:
Erklären Sie diesen letzten Punkt noch etwas: Wenn Sie auf self
für zwei völlig unterschiedliche Dinge synchronisieren (sagen wir eine Sitzungs-ID und eine Benutzer-ID), werden sie sich gegenseitig blockieren, obwohl dies nicht notwendig ist. Ich würde zwei separate Mutexe bevorzugen, um die Granularität gering zu halten.
Natürlich, wenn du nur einen Mutex für die Session-ID hast (aber siehe unten), kannst du synchronized(self)
verwenden, aber ich würde es lieber auf meine Art machen, damit ich nicht erwischt werde später eine weitere geschützte Ressource hinzufügen.
In jedem Fall (dies ist der erwähnte Vorbehalt) werden Sie wahrscheinlich feststellen, dass das Synchronisieren auf self
eine statische Variable, die über mehrere Objekte verteilt wäre, nicht angemessen schützen würde. Der Mutex sollte zu den Daten gehören, anstatt sie zu verwenden.
Ich denke, Sie verwenden besser atomare Operationen , um session_id
zu ändern. Eine vorherige Frage behandelt atomare Inkrement- / Dekrement-Operationen für OS X und < a href="http://www.cocoadev.com/index.pl?OSAtomic"> Diese Seite spricht über die Header-Datei OSAtomic
. Atomare Operationen an Ganzzahlen, die leicht hardwareunterstützt sind, werden wahrscheinlich wesentlich schneller sein als die Verwendung von Sperrkonstrukten.
Eine Antwort 4 Jahre später in iOS8. :O) Das Beste für mich ist, eine Singleton-Klasse wie folgt zu verwenden:
(yourFile.h)
%Vor%================================================== ====== (yourFile.m)
%Vor%Sie müssen nur die Methode 'generateSessionId' für jeden neuen Id-Wert aufrufen. Die Verwendung dieser Klasse zum Generieren Ihrer Session-IDs sollte weit genug sein, denke ich.
Ich hoffe, es wird den Lesern dieses Beitrags helfen. : o)
BEARBEITEN
Wie von einigen Lesern angegeben, ist der NSInteger-Wert auf diese Weise nicht threadsicher, nur der Singleton ist.
Um eine vollständige threadsichere 'Wert' -Instanzvariable zu erhalten, ändern Sie einfach ihren NSInteger-Typ in NSNumber (um mit geeigneten Methoden in 'int' konvertiert zu werden), das laut Apples Dokumentation vollständig Thread-sicher ist.
Dies kann der einfachste und schnellste Weg sein, um das gewünschte zu erhalten.
Es gibt viele Optionen, einschließlich (von hoher bis zu niedriger Ebene) die @synchronized
Objective-C-Direktive, NSLock
, pthread_mutex_lock
und atomare Operationen.
Lesen Sie den Abschnitt "Synchronisation" im Threading Programming Guide für Details.
Tags und Links objective-c thread-safety