zoukankan      html  css  js  c++  java
  • IOS多线程--锁

    NSLock  

    (0)为什么上锁

    1.atomic(原子操作)是指不会被线程机制打断,这种操作一旦开始就运行到结束,中间不会有任何的切换

        2.我们可以通过(NSLock)使这段代码成为原子操作

        3.使用线程锁,不是服务于线程,而是服务于代码,如果我们想对一段代码进行原子从操作的时候(数据库的写入)就可以加锁

        4.@synchronized(互斥锁)也能实现原子操作,但是关键字不能在一个函数中加锁,然后在另一个函数中解锁,lock就能实现

    (1)创建(线程锁,多个线程有一把锁就够了,谁锁谁打开)

    if (_threadLock == nil) {

            _threadLock = [[NSLock alloc]init];

        }

    (2)上锁(当有多个线程执行一个方法的时候、上锁后、只允许这个线程执行这个方法)

        [_threadLock lock];

    (3)解锁(执行完毕后解锁、下一个线程在接着执行这个方法)

    [_threadLock unlock];

    (4)互斥锁、在共享资源的“读”“写”范围内加、一般都用self锁

    锁是比较耗资源的、要让锁的范围尽量的小、使用锁对内存消耗比较昂贵

    @synchronized(self) 

    NSCondition  线程锁

    实例一、1个生产者,对应多个消费者

        1.创建一个实例

        2.如果是消费者,取得锁,然后去取产品,如果没有则wait,这时候就会释放锁,进入加锁代码,直到有线程唤醒它去消耗产品,然后解锁

        3.如果是制作者,首先也是取得锁,然后生产,再发signal,这样做会唤醒wait的消费者

    (1)生产者、取锁

    [self.condition lock];

    //1.生产

    //2.唤醒一个等待中的线程,随机的

    [self.condition signal];

      此方法能够唤醒所有等待的线程

    [self.condition broadcast];

    [self.condition unlock];

    (2)消费者、取锁

    [self.condition lock];

    //1.判断、如果没有产品、依次进入等待

        (condition一旦调用了wait,其他线程可以进入加锁代码(说明一下,这里是和之前的lock,sync同步关键字不同的地,因为lock是不能进入 加锁代码的)) [self.condition wait];

    //2.当被唤醒的时候、消费产品

    [self.condition unlock];

  • 相关阅读:
    mongodb远程连接配置
    CentOs系统设置python版本
    python非官方模块下载大全
    Series.str——字符串批量处理方法
    gevent-协程用法
    与vnpy相关的有用博客网址
    vnpy官网说明文档网址
    Opencv各种编码器下视频文件大小对比
    Linux下python默认版本切换成替代版本
    CPU拓扑结构
  • 原文地址:https://www.cnblogs.com/gaduo/p/4996556.html
Copyright © 2011-2022 走看看