iOS-多线程dispatch_semaphore_t dispatch_queue_t dispatch_group_t常见用法场景

  • dispatch_semaphore_t用法,dispatch_semaphore_create创建信号量实际就是创建的对象设置最大并发数.不得小于0, 小于0导致崩溃,dispatch_semaphore_wait, 减少一个信号量, 比如创建的对象信号量是5, wait一次就减少一个信号量,信号量变为4, 当信号量为0的时候当前线程就会等待,直到信号量>0的时候才会往下进行.dispatch_semaphore_signal增加一个信号量,减少与增加信号量是成对出现的.
dispatch_semaphore_t semap = dispatch_semaphore_create(1); // 控制最大并发数1条新线程 此时下面操作是线程安全的
dispatch_semaphore_wait(semap, DISPATCH_TIME_FOREVER);// 此时信号量由1 变为 0 ,即使下面有任务也不会再执行, 因为信号量为0
// 单个线程操作区域... 线程安全
dispatch_semaphore_signal(semap);
  • 第一种常见用法 group + queue 使用场景: 单次, 多个任务同时执行, 自动开启多个线程,最后执行完毕在回调处理执行完毕的结果
  • 缺点: 不能控制最大并发数, 操作同一资源不安全

// DISPATCH_QUEUE_CONCURRENT 生成一个并发队列(可以有多条线程)
    dispatch_queue_t queue = dispatch_queue_create("sendrequest", DISPATCH_QUEUE_CONCURRENT);
    // 创建group
    dispatch_group_t group = dispatch_group_create();
// 多个耗时任务同时进行 加入group中同时进行,执行完毕监听回调
    dispatch_group_async(group, queue, ^{
        NSLog(@"1");
        sleep(2);
        NSLog(@"1+");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"2");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"3");
    });

    // group任务全部执行完毕回调
    dispatch_group_notify(group, queue, ^{
        NSLog(@"done");
    });
  • 第二种使用场景 semaphore + queue 场景: 多次(有100个任务需要执行, 例如数据库100条数据,需要上传,每条创建一个任务,开2个线程), 控制最大并发数(后台开2个线程), group中不能控制最大并发数, 操作数据线程加锁,保证线程安全
  • 缺点不能处理回调

    dispatch_semaphore_t semap = dispatch_semaphore_create(2); // 控制最大并发数2条新线程
    // DISPATCH_QUEUE_CONCURRENT 生成一个并发队列(可以有多条线程)
    dispatch_queue_t queue = dispatch_queue_create("sendrequest", DISPATCH_QUEUE_CONCURRENT);
    // 10个任务, 最大并发2,
    for (int i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
                dispatch_semaphore_wait(semap, DISPATCH_TIME_FOREVER);
                // 线程操作区域
                 dispatch_semaphore_signal(semap);
            });
    }
  • 第三种场景组合用法: dispatch_semaphore_t(设置最大并发数) + dispatch_queue_t(创建并发队列) + dispatch_group_t(监听任务完成回调)可以处理任务完成回调, 可设置最大并发数

dispatch_semaphore_t semap = dispatch_semaphore_create(2); // 控制最大并发数2条新线程
    // DISPATCH_QUEUE_CONCURRENT 生成一个并发队列(可以有多条线程)
    dispatch_queue_t queue = dispatch_queue_create("sendrequest", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();

    for (int i = 0; i < 10; i++) {
        dispatch_group_async(group, queue, ^{
            dispatch_semaphore_wait(semap, DISPATCH_TIME_FOREVER);
            // 线程操作区域 最多有两个线程在此做事情
            dispatch_semaphore_signal(semap);
        });
    }
     // group任务全部执行完毕回调
    dispatch_group_notify(group, queue, ^{
        NSLog(@"done");
    });

原文地址:https://www.cnblogs.com/adampei-bobo/p/9078640.html

时间: 2024-10-15 04:18:14

iOS-多线程dispatch_semaphore_t dispatch_queue_t dispatch_group_t常见用法场景的相关文章

iOS开发多线程篇—GCD的常见用法

iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispat

iOS开发多线程篇 — GCD的常见用法

一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue()

iOS开发多线程篇—GCD的常见用法 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3807716.html 1 // 2 // YYViewController.m 3 // 01-GCD的常见使用(延迟执行) 4 // 5 // Created by apple on 14-6-25. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 11 @i

iOS开发多线程篇 08 —GCD的常见用法

iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispat

iOS多线程技术—GCD的用法

iOS多线程技术—GCD的用法 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: 1 // 2 // YYViewController.m 3 // 12-GCD的基本使用(主队列) 4 // 5 // Created by 孔医己 on 14-6-25. 6 // Copyright (c) 2014

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD.NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的.很顺畅的根据应用场景来选用相应 的多线程技术.阅读苹果官方文档和一些别人写的博客的时候也依然有种隔靴捞痒的 感觉:书读百边,不如实践一遍啊,SO,尽管网上相关的博客一大堆(首推这篇: http://www.cocoa

IOS中NSString的常见用法

iOS NSString的常用用法 //1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; //3.在以上方法中,提升速度:initWithString方法 NSString *astring = [[NSString allo

IOS中NSSData常见用法

一.NSdata的概念 1.使用文件时需要频繁地将数据读入一个临时存储区,它通常称为缓冲区 2.NSdata类提供了一种简单的方式,它用来设置缓冲区,将文件的内容读入缓冲区,或者将缓冲区内容写到一个文件. 3.对于32位应用程序,NSdata缓存最多2GB 4.我们有两种定义 NSData(不可变缓冲区),NSMutableData(可变缓冲区) NSData *fileData; NSFileManager *fileManager = [[NSFileManager alloc]init];

IOS中NSNumber常见用法

一.NSnumber常见用法 NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (int)intValue; - (double)doubleValue; -(float)floatValue; 二.使用 NSNumber * intNumber=[NSNumber numberWithInt:100]: NSNumber *floatNumber=[N