多线程应用

多线程在应用中频繁应用,多线程应用的也比较多。但是对多线程理解应用有误的话有可能造成死锁等问题。一下是自己在使用过程中一些理解,有出入失误地方,希望大神不惜赐教。
如果同一个时间点,多个线程同时操作(添加和读取)一个数组,如果不适用多线程则就会发生操性错误。下面是一个简单的使用

#import <Foundation/Foundation.h>
@interface DataManager : NSObject
+ (instancetype)shareInstance;
@property (nonatomic, strong) NSArray *data;
- (void)addData:(id)data;
@end
#import "DataManager.h"
@interface DataManager ()
@property (strong, nonatomic) NSMutableArray *dataArray;
@property (strong, nonatomic) dispatch_queue_t concurrentDataQueue;
@end

@implementation DataManager
+ (instancetype)shareInstance {
    static DataManager *dataManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dataManager = [[DataManager alloc] init];
        dataManager.concurrentDataQueue = dispatch_queue_create("com.kingiol.gcd.dataManagerQueue", DISPATCH_QUEUE_CONCURRENT);
    });
    return dataManager;
}

- (NSArray *)data {
    __block NSArray *returnData = nil;
    dispatch_sync(self.concurrentDataQueue, ^{
        returnData = [_dataArray copy];
    });
    return returnData;
}

- (void)addData:(id)data {
    if (data) {
        dispatch_barrier_async(self.concurrentDataQueue, ^{
            if (_dataArray == nil) {
                _dataArray = [NSMutableArray array];
            }
            @synchronized (self) {
                [_dataArray addObject:data];
                NSLog(@"---- %@",_dataArray);
            }
        });
    }
}

@end

对DataManager的使用(分为多线程调用,循环多线程调用)
多线程调用

- (void) {
dispatch_queue_t queue = dispatch_queue_create("async", DISPATCH_QUEUE_CONCURRENT);// 创建一个并行队列
     // 创建两个线程 同时往数组里面添加数据
     DataManager *manger = [DataManager shareInstance];
     dispatch_async(queue, ^{
     [manger addData:@"111"];
     });

     dispatch_async(queue, ^{
     [manger addData:@"222"];
     });

     dispatch_async(queue, ^{
     sleep(1);
     [manger addData:@"333"];
     });
dispatch_async(queue, ^{
     NSLog(@"=====%@", [manger data]);
     });
}

循环多线程调用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    DataManager *manger = [DataManager shareInstance];
    dispatch_apply(1000, queue, ^(size_t i) {
        dispatch_async(queue, ^{
            NSString *num = [NSString stringWithFormat:@"111-%zu",i];
            [manger addData:num];
        });
    });
    dispatch_async(queue, ^{
        sleep(4);
        NSLog(@"=====%@", [manger data]);
    });

以上就是多个线程操作同一个资源

  • 如果当前有3张图片,我们需要从网络上下载,下载完成之后统一提醒用户下载完成
- (void)GCDgROUP {
    // 如果当前有3张图片,我们需要从网络上下载,下载完成之后统一提醒用户下载完成
    dispatch_group_t downloaGroup = dispatch_group_create();
    for (int i = 0; i< 3; i ++) {
        dispatch_group_enter(downloaGroup);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
           // 下载图片程序
            NSLog(@"下载完成-- %d", i);
        // 在图片下载完成的block中调用
            dispatch_group_leave(downloaGroup);
        });
    }

    // 在主程序中提醒用户
    dispatch_group_notify(downloaGroup, dispatch_get_main_queue(), ^{
        // 提醒用户下载完成
        NSLog(@"下载完成");
    });

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值