J'ai une classe simple qui ressemble un peu à ceci:Démarrage et arrêt des opérations d'une manière thread-safe
@protocol Recorder
@property(BOOL) isRunning;
- (void) start;
- (void) stop;
@end
Et les implémentations de la méthode:
- (void) start {
if (running)
return;
…
running = YES;
}
- (void) stop {
if (!running)
return;
…
running = NO;
}
Et je commencé à penser à fil sécurité. La solution actuelle n'est pas thread-safe, non? Que diriez-vous ceci:
- (void) start {
@synchronized(self) {
if (running)
return;
…
running = YES;
}
}
Est-ce exact, à condition que la méthode -stop
est également synchronisé? Je n'aime pas l'imbrication supplémentaire introduite par @synchronized
, cependant. Le verrouillage explicite fonctionnerait-il?
- (void) stop {
[startStopLock lock];
if (running)
return;
…
running = YES;
[startStopLock unlock];
}
Ou pourrais-je faire encore cela?
enum { Running, Stopped };
NSConditionLock *startStopLock;
- (void) start {
if (![startStopLock tryLockWithCondition:Stopped])
return;
…
[startStopLock unlockWithCondition:Running];
}
Cette solution est-elle correcte? Feriez-vous les choses différemment?
Ceci est Objective-C sur iOS. Merci pour l'indice 'locked_xchg', j'ai' OSAtomicTestAndSet' qui devrait être à peu près le même. – zoul
Pas de problème. C'est une erreur classique que les gens font. Malheureusement, notre produit Jinx ne fonctionne pas sur l'iPhone. Sinon, je recommanderais de l'utiliser pour aider à attraper ces courses. –