博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
信号量 iOS之多线程GCD(四)
阅读量:6412 次
发布时间:2019-06-23

本文共 1936 字,大约阅读时间需要 6 分钟。

对于NSOperation来说,可以设置最大并发量。GCD并没有最大并发量的属性,只能靠信号量来实现。

信号量有三个函数:

(1)dispatch_semaphore_create创建信号量(即为总量)

(2)dispatch_semaphore_signal 发出信号,信号量+1

(3)dispatch_semaphore_wait 等待信号(当大于0,使其减1。等于0,阻塞线程)

信号量其实就是一个计数器,开始给定一个值。当值为0时,阻塞线程。

举例说明,代码如下:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);    for (NSInteger i = 0; i < 10; i++) {        dispatch_async(queue, ^{            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);            sleep(5);            NSLog(@"任务为:%ld - 来自线程%@",(long)i,[NSThread currentThread]);             dispatch_semaphore_signal(semaphore);        });    }复制代码

简单说明:上述代码总共异步执行10个任务,当设置信号量为2时,每一次执行任务信号量都会减1,当为0,说明正在执行的任务有两个,其他任务就会阻塞。任务完成时,信号量又会+1,其他任务才会执行。

打印结果如下:

2019-02-15 14:28:09.969990+0800 多线程demo[3663:206239] 任务为:0 - 来自线程
{number = 3, name = (null)}2019-02-15 14:28:09.969990+0800 多线程demo[3663:206236] 任务为:1 - 来自线程
{number = 4, name = (null)}2019-02-15 14:28:14.972266+0800 多线程demo[3663:206238] 任务为:2 - 来自线程
{number = 6, name = (null)}2019-02-15 14:28:14.972264+0800 多线程demo[3663:206237] 任务为:3 - 来自线程
{number = 5, name = (null)}2019-02-15 14:28:19.977519+0800 多线程demo[3663:206262] 任务为:4 - 来自线程
{number = 7, name = (null)}2019-02-15 14:28:19.977528+0800 多线程demo[3663:206263] 任务为:5 - 来自线程
{number = 8, name = (null)}2019-02-15 14:28:24.978105+0800 多线程demo[3663:206265] 任务为:7 - 来自线程
{number = 10, name = (null)}2019-02-15 14:28:24.978105+0800 多线程demo[3663:206264] 任务为:6 - 来自线程
{number = 9, name = (null)}2019-02-15 14:28:29.978800+0800 多线程demo[3663:206266] 任务为:8 - 来自线程
{number = 12, name = (null)}2019-02-15 14:28:29.978800+0800 多线程demo[3663:206267] 任务为:9 - 来自线程
{number = 11, name = (null)}复制代码

分析:信号量为2,同一时间执行两个任务。由于sleep(5),所以时间间隔为5秒。

转载于:https://juejin.im/post/5c6665e8f265da2dbb121a41

你可能感兴趣的文章
送给即将踏入软考征途的你
查看>>
这个图片功能咋生成的?
查看>>
使用jQuery和CSS创建一个粘性标题栏
查看>>
要命啦!Word中快速录入大全,内含快捷键小技巧,快来一起学习!
查看>>
智能计算,“芯”时代的华为云
查看>>
VB相册现在在
查看>>
C语言:流与缓冲区详解
查看>>
Python【0】:windows环境下 安装python3
查看>>
javascript实现音频mp3播放
查看>>
html5-离线缓存
查看>>
【JS插件】项目中用过的框架插件集合&使用心得
查看>>
linux系统安装完后的常见工作
查看>>
在Linux服务器、客户端中构建密钥对验证进行远程连接
查看>>
揪出MySQL磁盘消耗迅猛的真凶
查看>>
和“C”的再遇
查看>>
linux 的日志系统
查看>>
[转]一个python‘非多态’的问题
查看>>
手机邮箱哪个好用?
查看>>
一键安装kubernetes 1.13.0 集群
查看>>
使用Enum.Prase及Enum.TryPrase时的注意事项
查看>>