关于信号量的使用,我在csdn博客上几年前已经写过,这里不再重复
地址1:https://blog.csdn.net/qq_29892943/article/details/77717391
地址2:https://blog.csdn.net/qq_29892943/article/details/58132267
今天来探讨一下,信号量到底是在0时阻塞线程,还是在负值时阻塞线程:
上代码:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSLog(@"1111");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"222");
打印结果:
1111.png
很多人说信号量为0的时候阻塞线程,返回null,可是为什么这里还会打印111?而当dispatch_semaphore_wait时,这里的信号量-1,变成了-1,所以没有走222打印。所以,结果很明了了吧。
另外常用的组合:例如以下情况,分别执行两个异步的AFN网络请求,第二个网络请求需要等待第一个网络请求响应后再执行,使用信号量的实现:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSString *urlString1 = @"/Users/ws/Downloads/Snip20161223_20.png";
NSString *urlString2 = @"/Users/ws/Downloads/Snip20161223_21.png";
// 创建信号量
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:urlString1 parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"1完成!");
// 发送信号量
dispatch_semaphore_signal(sem);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"1失败!");
// 发送信号量
dispatch_semaphore_signal(sem);
}];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 等待信号量
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:urlString2 parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"2完成!");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"2失败!");
}];
});
}
网友评论