Thread sichere statische Variablen Ziel c

8

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.

    
Unis 28.10.2010, 02:17
quelle

4 Antworten

4

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:

  • Sperren Sie den Mutex, bevor Sie eine geschützte Ressource verwenden oder ändern.
  • Verwenden oder ändern Sie die Ressource.
  • entsperren den Mutex.
  • Bonustipp 1: Sperren Sie den Mutex so spät wie möglich und entsperren Sie ihn so schnell wie möglich.
  • Bonustipp 2: Sperren Sie nur das, was Sie brauchen, um unnötige Verzögerungen zu vermeiden.

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.

    
paxdiablo 28.10.2010, 02:31
quelle
8

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.

    
Wyatt Anderson 28.10.2010 02:38
quelle
2

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.

    
XLE_22 01.10.2014 15:48
quelle
1

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.

    
David Gelhar 28.10.2010 02:43
quelle

Tags und Links