У меня были проблемы с безопасностью потоков. У меня есть очередь, которая, когда я изменил содержимое, вызвала ошибки в потоках. Раньше я не использовал замки, но решил попробовать. Я добавил блокировку всего кода, который манипулировал резервным массивом NSMutableArray для моей очереди. Проблема, я думаю, в том, что я не использовал один и тот же замок для всех из них. Я создал новый экземпляр NSLock в каждом методе, который модифицировал массив. Я предполагаю, что мне следует использовать один NSLock ivar для защиты массива. Но мое замешательство связано с тем, что это сработало, как только я его добавил. Ниже приведен образец. Я предполагаю, что везде, где я создавал новый NSLock, я должен был просто использовать один ivar NSLock. Я бы подумал, что этот код просто заблокировал очереди против других очередей и очереди против других очередей, а не очереди против очередей. Уточнение было бы здорово.
@implmentation
...
- (void)enqueue:(id)obj
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
[_backingStore addObject:obj];
[arrayLock unlock];
}
- (id)dequeue
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
id result = [_backingStore firstObject];
if( result )
{
[_backingStore removeObjectAtIndex:0];
}
[arrayLock unlock];
return result;
}
...
@end