• 记录一下锁如何使用


    条件锁

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

    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");
  • 相关阅读:
    20200213 超级聊天术
    20220210 java.util.Properties
    20220210 java.util.concurrent.BlockingQueue 方法说明
    20220210 java.util.Queue
    20220210 java.lang.Long
    20220210 Java 反射基础类
    一组很有意思的Principles
    python logging用法的简单总结
    好好的Typora收费了!_2022_01_20
    一些常用的jQuery方法1_20220128
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/14841561.html
Copyright © 2020-2023  润新知