GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量。

1.首先熟悉下几个函数

dispatch_semaphore_create 创建一个信号量,设置一个初始值
dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1
dispatch_semaphore_wait 等待信号,信号量-1

当一个信号量被通知 ,信号量就会加1,当一个信号等待,信号总量就减1,当减到信号量小于0时,线程会被阻塞,信号量不会在减了。直到信号量大于0时,线程会再次启动执行

下面参考http://blog.sina.cn/dpool/blog/s/blog_ac94a55f0101pa4l.html建了一个初始值为10的信号量

 dispatch_group_t group=dispatch_group_create();
    dispatch_semaphore_t semaphore=dispatch_semaphore_create(10);
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i=0; i<100; i++) {
        //信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"test %d",i);
        //每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内
        dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

运行结果:

上面的例子可能效果不太明显,现在设置信号量初始值为1,看下 面代码段:

dispatch_group_t group=dispatch_group_create();
    dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i=0; i<100; i++) {
        //信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"test %d",i);
        //每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内
        dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

运行结果:

初始值设为1时,相当于是串行队列,单线程执行。

时间: 2024-08-01 12:49:37

GCD之信号量机制一的相关文章

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信号量机制

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

基类子类在Qt信号量机制下的思考

背景知识: 基类 superClass class superClass { public: superClass(){ std::cout << "superClass()" << std::endl; } virtual ~superClass(){} virtual void print() { std::cout << "superclass print " << std::endl; } }; 子类subCl

信号量机制DOWN操作和UP操作的详细说明

DOWN操作:linux内核.信号DOWN例如,下面的操作: void down(struct semaphore *sem); //不间断 int down_interruptible(struct semaphore *sem);//可中断 int down_killable(struct semaphore *sem);//睡眠的进程能够由于受到致命信号而被唤醒,中断获取信号量的操作. int down_trylock(struct semaphore *sem);//试图获取信号量,若无