OC中对pthread封装的相关类

NSLock

NSLock是对p_thread_mutex_t普通锁的封装,初始化和普通OC类初始化一样,常用方法lock、unlock,相对于p_thread_mutex_t使用更简单。

NSRecursiveLock

NSRecursiveLock是对p_thread_mutex_t递归锁的封装,初始化和普通OC类初始化一样,常用方法也是lock、unlock。

NSCondition

NSCondition是对p_thread_mutex_t和p_thread_cond_t的封装,初始化和普通OC类初始化一样,常用方法lock、unlock、wait、signal。

NSConditionLock

NSConditionLock是对NSCondition的进一步封装,可用于实现线程间依赖。常用方法
初始化方法:initWithCondition:
加锁:lockWhenCondition:
解锁:unlockWhenCondition:
先看下控制线程间依赖的代码,我们通过代码来对NSConditionLock进行分析

  - (void)test{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
    [self thread1];
});
dispatch_async(queue, ^{
    [self thread2];
});
dispatch_async(queue, ^{
    [self thread3];
});
}
- (void)thread1{
[self.conditionLock lock];
NSLog(@"%s", __func__);
sleep(2);
[self.conditionLock unlockWithCondition:1];
}
- (void)thread2{
[self.conditionLock lockWhenCondition:1];
NSLog(@"%s", __func__);
sleep(2);
[self.conditionLock unlockWithCondition:2];
}
- (void)thread3{
[self.conditionLock lockWhenCondition:2];
NSLog(@"%s", __func__);
sleep(2);
[self.conditionLock unlock];
}

如果初始化的方法没有condition这个参数,那么默认的condition是0,那么我们可以直接使用lock进行加锁。

代码是创建了三个线程,要让这三个线程按顺序依次执行。第一个执行的线程我们先使用lock进行加锁,解锁的的条件是1,然后让第二个执行的线程在条件是1的情况下进行加锁,解锁条件是2,然后让第三个执行的线程在条件是2的情况下进行加锁,最终解锁。简言之就是下一个线程加锁的条件和上一个线程解锁的条件相同。

对于多个线程执行顺序的这种问题我们类似地还应想到GCD中的group、wait、栅栏。
可以看下这几篇文章:
iOS开发中在指定的某些线程执行完之后去执行其他线程
iOS开发中GCD的一些用法
iOS开发中的并发、串行队列,同步、异步任务
注意:为了保证线程同步执行不一定要使用锁,我们还是使用串行队列。

你可能感兴趣的:(OC中对pthread封装的相关类)