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.

Другие вопросы по тегам