Я пишу класс Objective-C, который я хочу быть потокобезопасным.Для этого я использую pthreads и pthread_rwlock
(использование @synchronized
- это излишне, и я хочу узнать немного больше о pthreads).Блокировка инициируется в объектах, обозначенных методом init
, и уничтожается в dealloc
.У меня есть три метода манипулирования замком;readLock
, writeLock
, unlock
.Эти три метода просто вызывают связанные функции pthread и в настоящее время больше ничего.
Вот два метода объектов, для каждого из которых требуется writeLock:
-(void)addValue:(const void *)buffer
{
[self writeLock];
NSUInteger lastIndex = self.lastIndex;
[self setValue:buffer atIndex:(lastIndex == NSNotFound) ? 0 : lastIndex+1];
[self unlock];
}
-(void)setValue:(const void *)buffer atIndex:(NSUInteger)index
{
[self writeLock];
//do work here
[self unlock];
}
Сначала будет вызываться setAddValue:
получить блокировку записи и затем вызвать setValue:atIndex:
, которая также попытается получить блокировку записи.Документация заявляет, что поведение не определено, когда это происходит.Следовательно, как проверить, есть ли у потока блокировка, прежде чем пытаться получить блокировку?
(я мог бы гарантировать, что критическая секция не будет вызывать вызов, который вызовет другой запрос блокировки, но это будет означать повторение кода, и я хочу, чтобы мой код оставался СУХИМЫМ).