【发布时间】:2011-04-23 18:33:45
【问题描述】:
我正在编写一个希望线程安全的 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:,它也将尝试获得一个写锁。文档指出,发生这种情况时行为未定义。因此,如何在尝试获取锁之前检查线程是否有锁?
(我可以确保临界区不进行触发另一个锁定请求的调用,但这意味着代码重复,我希望保持我的代码 DRY)。
【问题讨论】:
标签: objective-c c pthreads posix readwritelock