ios开发GCD(2)-dispatch_semaphore_t信号量计数器
程序员文章站
2022-07-02 15:01:25
思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办? dispatch_semaphore_t 看代码解析: 看打印结果: 解析: 这里有4个线程异步执行,正常情况下,是同时执行的,不分先后; 这里将信号量设为2,说明同时只能执行2个任务。 代码执行到任务1,信号量-1,这时 ......
思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办?
dispatch_semaphore_t
看代码解析:
nslog(@"开始"); dispatch_semaphore_t t = dispatch_semaphore_create(2);//设置信号量初始值 dispatch_async(dispatch_queue_create("one", dispatch_queue_concurrent), ^{ dispatch_semaphore_wait(t, dispatch_time_forever);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作 nslog(@"任务1=%@",[nsthread currentthread]); sleep(5); dispatch_semaphore_signal(t);//任务完成,信号量+1 }); dispatch_async(dispatch_queue_create("two", dispatch_queue_concurrent), ^{ dispatch_semaphore_wait(t, dispatch_time_forever);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作 nslog(@"任务2=%@",[nsthread currentthread]); sleep(5); dispatch_semaphore_signal(t);//任务完成,信号量+1 }); dispatch_async(dispatch_queue_create("three", dispatch_queue_concurrent), ^{ dispatch_semaphore_wait(t, dispatch_time_forever);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作 nslog(@"任务3=%@",[nsthread currentthread]); dispatch_semaphore_signal(t);//任务完成,信号量+1 }); dispatch_async(dispatch_queue_create("four", dispatch_queue_concurrent), ^{ dispatch_semaphore_wait(t, dispatch_time_forever);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。 //要执行的操作 nslog(@"任务4=%@",[nsthread currentthread]); dispatch_semaphore_signal(t);//任务完成,信号量+1 });
看打印结果:
2018-10-16 14:05:48.148321+0800 nsthread-gcd-nsoperation[5280:2575154] 开始 2018-10-16 14:05:48.150346+0800 nsthread-gcd-nsoperation[5280:2575369] 任务1=<nsthread: 0x1c0279a40>{number = 3, name = (null)} 2018-10-16 14:05:48.150867+0800 nsthread-gcd-nsoperation[5280:2575278] 任务2=<nsthread: 0x1c447ee00>{number = 4, name = (null)} 2018-10-16 14:05:53.152640+0800 nsthread-gcd-nsoperation[5280:2575371] 任务3=<nsthread: 0x1c046bd00>{number = 5, name = (null)} 2018-10-16 14:05:53.152729+0800 nsthread-gcd-nsoperation[5280:2575372] 任务4=<nsthread: 0x1c4476440>{number = 6, name = (null)}
解析:
这里有4个线程异步执行,正常情况下,是同时执行的,不分先后;
这里将信号量设为2,说明同时只能执行2个任务。
代码执行到任务1,信号量-1,这时信号量=1;因为我们设置的同时可以执行2个任务,所以任务2此时也可以执行,代码执行到任务2时,信号量继续-1,此时信号量=0;因为前两个任务都是耗时操作,任务不完成,导致信号量不释放出来(+1),所以后面的异步线程不会执行;只有当前面的有任务完成,信号量+1,这时监测到信号量>0,才会执行后面的任务。
由打印结果可以看到,任务3和4打印时间比任务1和2迟了5秒。