2018/5/18 15:03:38当前位置推荐好文程序员浏览文章

信号量就是一个资源计数器,设定了一个信号量,在线程访问之前,加上信号量的解决,则可告知系统按照我们指定的信号量数量来执行多个线程。其实,这有点相似锁机制了,只不过信号量都是系统帮助我们解决了,我们只要要在执行线程之前,设定一个信号量值,并且在用时,加上信号量解决方法就行了。

GCD 的信号量

/创立信号量dispatch_semaphore_create(信号值)//发送信号量dispatch_semaphore_signal(信号量)//等待信号量dispatch_semaphore_wait(信号量,等待时间)DISPATCH_TIME_FOREVER
  • 执行dispatch_semaphore_create 会根据传入的long型参数创立对应数目的信号量;执行 dispatch_semaphore_signal 会添加一个信号量;执行dispatch_semaphore_wait 则会 -1 信号量,假如信号量是0,就会根据传入的等待时间来等待。
  • GCD中的信号量dispatch_semaphore进行实现,即营建线程同步情况。
    dispatch_semaphore 信号量为基于计数器的一种线程同步机制。使用于处理在多个线程中访问共有资源,由于多线程特性而引发的数据出错问题。
    假如 semaphore 大于等于1,计数-1,返回,程序继续执行。假如计数为0,则等待,等待时间为 dispatch_semaphore_wait 传入时间。假如在等待时间内没有 dispatch_semaphore_signal 信号量 +1 ,则时间到了会继续往下执行。
    dispatch_semaphore_signal(semaphore)为计数+1操作。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)为设置等待时间,这里设置的等待时间是一直等待。
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);    dispatch_group_t group = dispatch_group_create();     dispatch_group_async(group, queue, ^{        [self tenderRequest:^ {              dispatch_semaphore_signal(semaphore);        }];      });    dispatch_group_async(group, queue, ^{        [self tenderRequest:^ {              dispatch_semaphore_signal(semaphore);        }];     });    dispatch_group_notify(group, queue, ^{        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);              // 要执行的后续操作    });    
网友评论