NSLock, количество ожидающих потоков
Я разрабатываю приложение для iOS, и мне нужно реализовать решение проблемы, для которой мне нужно знать, сколько потоков ожидает блокировки одного и того же объекта NSLock.
В Java у меня есть класс ReentrantLock с методом getQueueLength, который "возвращает оценку числа потоков, ожидающих получения этой блокировки".
Есть ли что-то похожее в Objective-C? Я пытался найти что-то, но ничего. Должен ли я подкласс NSLock для реализации этого механизма самостоятельно?
2 ответа
Вы можете создать подкласс NSLock
с той же функциональностью, переопределяя lock
, unlock
а также tryLock
методы.
Пример:
@interface ReentrantLock : NSLock
@property (atomic) NSInteger numberOfThreads;
- (void)lock;
- (void)unlock;
- (BOOL)tryLock;
@end
@implementation ReentrantLock
- (void)lock {
self.numberOfThreads += 1;
[super lock];
}
- (void)unlock {
self.numberOfThreads -= 1;
[super unlock];
}
- (BOOL)tryLock {
self.numberOfThreads += 1;
return [super tryLock];
}
@end
Посмотрите на OSAtomic.h. Вы можете создать глобальный счетчик, затем перед тем, как поток попытается получить блокировку, увеличить его, а затем уменьшить. Чтобы прочитать текущее значение, вы "добавляете" 0 к нему и смотрите возвращаемое значение. Я использовал их в течение многих лет на OSX и IOS.