记录一下锁如何使用
条件锁
条件锁 是 (互斥锁 + 运行条件)
https://blog.csdn.net/chengonghao/article/details/51779279 该文章对条件锁的场景和作用说明比较详细
场景:A线程执行依赖条件P,B线程可以提供条件P,但是由于使用单纯的互斥锁,A已经占用了锁,B被迫休眠无法运行提供条件,导致死锁。
// 以下均为值变量,在block中不加__block则只是一份值拷贝,不能影响到外面的锁变量 BOOL __block canRunning = NO; pthread_mutex_t __block lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t __block cond = PTHREAD_COND_INITIALIZER; [NSThread detachNewThreadWithBlock:^{ NSLog(@"开始生产"); [NSThread sleepForTimeInterval:2.0]; NSLog(@"生产完成"); pthread_mutex_lock(&lock); // 如不涉及到临界资源(数据)的修改,则发送信号前后可不加锁(因为运用了条件锁,在等待时可获得互斥锁) canRunning = YES; // 此处修改不重要,主要的是下面pthread_cond_signal条件满足的信息传递 pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); }]; pthread_mutex_lock(&lock); if (!canRunning) { NSLog(@"被迫等待"); // pthread_cond_wait(&cond, &lock); // 不满足运行条件,此时线程会被挂起 struct timespec time; clock_gettime(CLOCK_REALTIME, &time); time.tv_sec += 3; //此处增加为多少秒之后,如果是tv_nsec增加则为多少纳秒之后,设置纳秒不能大于1秒 int result = 0; if ((result = pthread_cond_timedwait(&cond, &lock, &time)) == 0) { NSLog(@"等到了"); NSLog(@"取得资源完成任务"); } else { NSLog(@"没有等到结束吧 %d", result); } } pthread_mutex_unlock(&lock); NSLog(@"Over");