Notes

使用锁

使用 Mutex

要使用 Mutex, 步骤很简便

  1. 声明一个和初始化 pthread_mutex_t 的变量
  2. 使用 pthread_mutex_lock 上锁,使用 pthread_mutex_unlock 解锁
  3. 使用 pthread_mutex_destroy 释放锁

使用 Mutex 模版

pthread_mutex_t mutex;
void MyInitFunction()
{
    pthread_mutex_init(&mutex, NULL);
}
 
void MyLockingFunction()
{
    pthread_mutex_lock(&mutex);
    // Do work.
    pthread_mutex_unlock(&mutex);
}

使用 NSLock

NSLock 实际上时实现了 NSLocking 协议的类,其中定义了 lockunlock 方法

除此以外,NSLock 还额外添加了 tryLocklockBeforeDate: 两个方法

BOOL moreToDo = YES;
NSLock *theLock = [[NSLock alloc] init];
...
while (moreToDo) {
    /* Do another increment of calculation */
    /* until there’s no more to do. */
    if ([theLock tryLock]) {
        /* Update display used by all threads. */
        [theLock unlock];
    }
}

使用 @synchronized 指令

是 Objective-C 中简便的直接创建 Mutex 的方式,工作方式与 Mutex 一样

- (void)myMethod:(id)anObj {
    @synchronized(anObj) {
        // Everything between the braces is protected by the @synchronized directive.
    }
}

使用 NSRecursiveLock

NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];
 
void MyRecursiveFunction(int value)
{
    [theLock lock];
    if (value != 0)
    {
        --value;
        MyRecursiveFunction(value);
    }
    [theLock unlock];
}
 
MyRecursiveFunction(5);

使用 NSConditionLock

要注意几点

利用 NSConditionLock 实现「生产者-消费者」

生产者

id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
 
while(true) {
    [condLock lock];
    /* Add data to the queue. */
    [condLock unlockWithCondition:HAS_DATA];
}

消费者

while (true) {
    [condLock lockWhenCondition:HAS_DATA];
    /* Remove data from the queue. */
    [condLock unlockWithCondition:(isEmpty ? NO_DATA : HAS_DATA)];
 
    // Process the data locally.
}