GCD信号量机制

1.创建信号量,创建的初始值决定线程并发数

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

2.等待信号

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

// 由于是异步执行的,所以每次循环Block里面的dispatch_semaphore_signal根本还没有执行就会执行dispatch_semaphore_wait,从而semaphore-1.当循环10此后,semaphore等于0,则会阻塞线程,直到执行了Block的dispatch_semaphore_signal 才会继续执行

3.发信号,信号量值会加1

dispatch_semaphore_signal(semaphore);

4.信号量可使多个异步线程同步执行

dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);

dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"thread 2");

sleep(2);

dispatch_semaphore_signal(semaphore2);

});

dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER);

NSLog(@"thread 1");

sleep(2);

dispatch_semaphore_signal(semaphore1);

});

dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);

NSLog(@"main thread");

原文地址:https://www.cnblogs.com/zhengweifang/p/11447340.html

时间: 2024-08-05 10:36:01

GCD信号量机制的相关文章

GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量. 1.首先熟悉下几个函数 dispatch_semaphore_create 创建一个信号量,设置一个初始值dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1dispatch_semaphore_wait 等待信号,信号量-1 当一个

GCD之信号量机制二

在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 dispatch_group_t group=dispatch_group_create(); // dispatch_semaphore_t semaphore=dispatch_semaphore_create(1); dispatch_queue_t queue=dispatch_get_global_queue(DI

【操作系统总结】进程同步的信号量机制

信号量机制是由dijkstra 1965年提出,是解决进程同步重要的工具 下面方法适用与几个进程访问同一个临界区 整形信号量 定义一个表示资源数目的整形信号量S,仅能同步P, V操作改变.原始值S=1,每一个进程来的时候会执行: 首先执行wait()操作,如果信号量s<=0就会一直检测并阻塞 如果不小于0就会进入临界区,并把S设为0,保证其他进程无法进去临界区 在临界区执行完,再把信号量设置回来. wait(S) { while(S <= 0);//资源如果小余0就会阻塞.一直在这边检测 S-

信号量机制

11.1 2 个程序的例子 先看 2 个程序: #include<unistd.h> int main(void) { allarm(10); for(;;;); } 这段程序的含义比较明显:这个程序在一个无限循环中,直到过了 10 秒,之后 程序被终止. 在来看另外一个程序: Static void setvalue(void) { Flag=1; } int main(void) { int sum=0; int flag=0; struct sigaction act; act.sa_h

操作系统之信号量机制总结

1965年,荷兰学者Djikstra提出信号量(Semaphores)机制是一种卓有成效的进程同步工具.在长期的应用中,信号量机制又获得了很大的发展,从整型信号量记录型信号量,进而发展成"信号量集"机制,下面我们来讨论一下各种信号量机制的内容. 1.整形信号量(经典的PV操作:P(wait):申请资源 V(signal):释放资源) 1 wait(S):while S<=0 do no-op; 2 S:=S-1; 3 signal(S): S:=S+1 2.记录型信号量 在整形信

锁机制,信号量机制,事件机制

IPC -- inter process Communication  进程间通信 守护进程随着父进程的代码执行完毕才结束 代码:from multiprocessing import Processimport time def func1(): for i in range(65,90): print(chr(i)) time.sleep(0.5) def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ ==

操作系统——信号量机制

一.知识总览 信号量机制的基本原理:两个或多个进程可以利用彼此间收发的简单的信号来实现“正确的”并发执行,一个进程在收到一个指定信号前,会被迫在一个确定的或者需要的地方停下来,从而保持同步或互斥. 二.整型信号量 三.记录型信号量 typedef struct{ int value; struct process *L; }semaphore//信号量 void wait(semaphore S){//wait原语 S.value--; if(S.value<0){ block(S.L);//阻

GCD 信号量

这种情况下,将所有的数据追加到NSMutableArray中. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSMutableArray *array = [[NSMutableArray alloc]init]; for (int i = 0; i < 100000; i++) { dispatch_async(queue, ^{ [NSThread sleepF

用GCD线程组与GCD信号量将异步线程转换为同步线程

有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. 线程组用以监听线程的执行情况,而信号量就是用来将异步线程转化为同步线程. 以下是打印的数据: 2015-02-25 18:34:23.208 YXMWeather[265:8748] 请求1数据 2015-02-25 18:34:23.209 YXMWeather[265:8790] 1信号量结束 2015-