记录一下锁如何使用

条件锁

条件锁 是 (互斥锁 + 运行条件)

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");

 

posted @ 2021-06-02 15:43  雨筱逸悠  阅读(79)  评论(0编辑  收藏  举报