У меня есть простой класс, который выглядит примерно так:
@protocol Recorder
@property(BOOL) isRunning;
- (void) start;
- (void) stop;
@end
И реализации метода:
- (void) start {
if (running)
return;
…
running = YES;
}
- (void) stop {
if (!running)
return;
…
running = NO;
}
И я начал думать о безопасности потоков.Текущее решение не является потокобезопасным, верно?Как насчет этого:
- (void) start {
@synchronized(self) {
if (running)
return;
…
running = YES;
}
}
Правильно ли это при условии, что метод -stop
также синхронизирован?Однако мне не нравится дополнительная вложенность, введенная @synchronized
.Будет ли работать явная блокировка?
- (void) stop {
[startStopLock lock];
if (running)
return;
…
running = YES;
[startStopLock unlock];
}
Или я мог бы сделать даже это?
enum { Running, Stopped };
NSConditionLock *startStopLock;
- (void) start {
if (![startStopLock tryLockWithCondition:Stopped])
return;
…
[startStopLock unlockWithCondition:Running];
}
Это решение правильно?Вы бы поступили иначе?