GCD使用dispatch_semaphore_t创建多线程网络同步请求

一、简介:

dispatch_semaphore_t:表示信号,生成信号的方法是

dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);

其中参数0表示该新生成信号的总的信号量为0个。

dispatch_semaphore_wait:信号等待,它像一个安保,比如小区规定最多只能进入3辆车,而进入一辆车后名额就会减少一个,当剩下的名额为0的时候,再有汽车说要进去时,就只能在外面等待了,直到有名额闲置出来了,才能开进小区。

dispatch_semaphore_signal:信号释放,当有一辆车从小区出来时,就腾出来了一个名额。

二、验证

这三个常用方法解释就暂且到这里,下面用代码来验证下上面介绍的作用。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

[self syncAction1];

}

- (void)syncAction1{

//使用GCD的信号量 dispatch_semaphore_t 创建同步请求

dispatch_group_t group =dispatch_group_create();

dispatch_queue_t globalQueue=dispatch_get_global_queue(0, 0);

dispatch_group_async(group, globalQueue, ^{

dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);

//模拟网络多线程耗时操作

dispatch_group_async(group, globalQueue, ^{

sleep(3);

NSLog(@"%@---block1结束。。。",[NSThread currentThread]);

dispatch_semaphore_signal(semaphore);

});

NSLog(@"%@---1结束。。。",[NSThread currentThread]);

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

});

dispatch_group_async(group, globalQueue, ^{

dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);

//模拟网络多线程耗时操作

dispatch_group_async(group, globalQueue, ^{

sleep(3);

NSLog(@"%@---block2结束。。。",[NSThread currentThread]);

dispatch_semaphore_signal(semaphore);

});

NSLog(@"%@---2结束。。。",[NSThread currentThread]);

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

});

dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{

NSLog(@"%@---全部结束。。。",[NSThread currentThread]);

});

}

运行APP,点击页面,打印的结果如下:

2016-12-22 23:45:36.633 GCDTest[852:27326] <NSThread: 0x7fce485154f0>{number = 2, name = (null)}---1结束。。。

2016-12-22 23:45:36.633 GCDTest[852:27328] <NSThread: 0x7fce48606f40>{number = 3, name = (null)}---2结束。。。

2016-12-22 23:45:39.633 GCDTest[852:27329] <NSThread: 0x7fce48512ea0>{number = 4, name = (null)}---block1结束。。。

2016-12-22 23:45:39.633 GCDTest[852:27330] <NSThread: 0x7fce484a9960>{number = 5, name = (null)}---block2结束。。。

2016-12-22 23:45:39.634 GCDTest[852:27328] <NSThread: 0x7fce48606f40>{number = 3, name = (null)}---全部结束。。。

结论:通过打印结果可以验证,

1.只有当剩余信号总量大于0时线程才能通过dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);方法,继续向下执行。

2.当dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);下面的代码无法执行处于等待情况下时,dispatch_semaphore_signal(semaphore);一旦执行,释放出自己的信号,则代码又可以愉快的往下执行了。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

for (int i = 0; i < 100; i++)

{

  dispatch_async(queue, ^{

    // 相当于加锁

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

      NSLog(@"i = %zd semaphore = %@", i, semaphore); // 相当于解锁

      dispatch_semaphore_signal(semaphore);

  });

}

原文地址:https://www.cnblogs.com/sundaysgarden/p/10371986.html

时间: 2024-10-12 09:20:14

GCD使用dispatch_semaphore_t创建多线程网络同步请求的相关文章

iOS开发多线程网络———多线程概念及GCD

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(htt

苹果多线程网络编程之-GCD队列与任务的理解

今天就 iOS 的多线程 GCD 的使用做了一些总结和理解. GCD,Grand Central Dispatch,是Apple开发的一个多核编程的解决方法. GCD其实就是创建/获取一个队列,在 Block 块或方法(函数)里写需要执行的任务代码块,然后将任务放到合适的队列里执行.GCD队列呢,分三种:主队列(串行队列).全局队列(并行队列).自定义队列(自定义).任务执行方法呢,又分为同步执行和异步执行.至于串行队列.并行队列,同步执行.异步执行的特点,自行去学习,这里不做过多阐述.大概意思

IOS - 网络(HTTP请求、同步请求、异步请求、JSON解析数据)

1 // 2 // ViewController.m 3 // IOS_0129_HTTP请求 4 // 5 // Created by ma c on 16/1/29. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 12 @interface ViewController

关于GCD学习,创建及使用多线程的几种方法

近期刚刚学习了一种多线程技术,现结合自己的理解将其罗列出来,希望能够与大家交流一下,多线程是一种能够节省程序运算时间的方法,大大的提高了程序的运算效率,那么首先我们来说一下进程和线程概念: 一个程序包含一个以上的进程,而一个进程又可以包含一个以上的线程,每一个进程都有自己独立的内存空间,相应的一个进程中的所有线程都共享该内存空间. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的资源分配单元,也是基本的执行单元.

网络处理2-异步POST请求和同步请求

本文目录 一.异步POST请求 二.NSURLConnection的其他请求方法 上一讲介绍了iOS中的异步GET请求,这讲来看看异步POST请求. 回到顶部 一.异步POST请求 假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个: username :母鸡 pwd :123 1.POST请求细节分析 要想在iOS中发送一个POST请求,首先要了解POST请求的一些细节: 1> 跟GET请求不一样的是,POST请求的请求参数不是拼接在

网络数据同步请求加载

#import "ViewController.h" @interface ViewController () @property(nonatomic,weak)IBOutlet UIButton *button; @property(nonatomic,weak)IBOutlet UIImageView *imageView; @end @implementation ViewController -(IBAction)btnClick:(id)sender{    //给一个url

Python标准库08 多线程与同步 (threading包)

Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种网络服务器的后台工作语言 (比如豆瓣网),所以多线程也就很自然被Python语言支持. (关于多线程的原理和C实现方法,请参考我之前写的Linux多线程与同步,要了解race condition, mutex和condition variable的概念) 多线程售票以及同步 我们使用Python来实

Linux多线程与同步

Linux多线程与同步 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 典型的UNIX系统都支持一个进程创建多个线程(thread).在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程.尽管实现方式有异于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别. 多线程 我们先来看一下什么是多线程.在Linux从程序到进程中,我们看到了一个程序在内存中的表示.这个程

iOS多线程开发——GCD的使用与多线程开发浅析(二)

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己.最近刚看完了<Objective-C高级编程 iOS与OS X多线程和内存管理>这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录.这本书我已经上传至网盘  https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者必读的书之一,写得很不错,欢迎大家下载阅读.书的封面如下,故也称狮子书: . (1)多线程会遇到的问题 . 多线程会出现什么问题呢?当多个线程对同一