当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS开发-多线程队列测试代码

IOS开发-多线程队列测试代码

2019年07月24日  | 移动技术网移动技术  | 我要评论
直接贴测试代码了。 当前考虑的问题: 1.队列有多少个消费者 2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度

直接贴测试代码了。

当前考虑的问题:
1.队列有多少个消费者
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞)
3.多个队列之间的调度(此文章未涉及)

//
// 单线程和多线程并发队列测试(同步和异步)
//
// 基础原理:
// 1)队列:
//  1.1 dispatch_queue_t 是一个队列,一个fifo的消费队列
//  1.2 消费者:队列配置的运行线程
//  1.3 被消费对象: 添加到队列中的运行任务(block等)
//  1.4 运行任务:将任务放到队列中,等待消费者消费
// 2)同步,异步  (对于任务) (此处的运行指将任务发入到请求队列中)
//  2.1 同步:a任务在运行时,插入b任务,a任务等待b任务运行完才能运行
//  2.2 异步: a任务在运行时,插入b任务,a任务不等待并且继续运行,b任务也运行
// 假设:
// atask: 运行fooa的block
// btask: 运行foob的block
//
//
// 总结:
// 不管单线程或多线程,同步或异步,一定要联系请求队列考虑



#import "testqueuesi.h"

@interface testqueuesi ()

@property (strong,nonatomic) dispatch_queue_t serialqueue;
@property (strong,nonatomic) dispatch_queue_t concurrentqueue;

@end

@implementation testqueuesi


- (instancetype)init {
  self = [super init];
  if(self) {
    _serialqueue = dispatch_queue_create("chenhh.serialqueue", dispatch_queue_serial);
    _concurrentqueue = dispatch_queue_create("chenhh.concurrentqueue", dispatch_queue_concurrent);

  }
  return self;
}

/**
 queue_serial(单线程) 同步
 死锁崩溃
 
 1.atask运行,同步加入btask
 2.btask加入到请求队列中,可是没有其他空余线程(atask线程在 等待btask),btask等待空余线程,
 3.死锁发生
 
 */
- (void)testserialqueuesync {
  dispatch_sync(_serialqueue,^{
    [self fooa];
    dispatch_sync(_serialqueue,^{
       [self foob];
    });
    [self fooa];
  });
}

/**
 queue_concurrent(多线程) 同步
 正常运行

 1.atask运行,同步加入btask,atask线程等待
 2.btask加入到请求队列中,有其他空余线程(atask线程在等待btask),btask运行
 3.btask运行结束,atask停止等待,继续运行
 
 */
- (void)testconcurrentqueuesync {
  dispatch_sync(_concurrentqueue,^{
    [self fooa];
    nslog(@"first");
    
    // 同步 需要等待运行结果
    dispatch_sync(_concurrentqueue,^{
      [self foob];
    });
    
    // 等待同步代码完成,再运行
    [self fooa];
  });
}

/*
 queue_serial(单线程) 异步
 正常
 
 
 1.atask运行,异步加入btask,atask线程继续运行不等待
 2.btask加入到请求队列中,没有其他空余线程(atask线程在正常运行),btask等待空余
 3.atask运行完成,线程空出,btask运行
 
 */
- (void)testserialqueueasync {
  dispatch_async(_serialqueue,^{
    [self fooa];
    dispatch_async(_serialqueue,^{
      [self foob];
    });
     [self fooa];
  });
}

/**
 queue_concurrent(多线程) 异步
 正常运行
 
 1.atask运行,同步加入btask,atask线程继续运行不等待
 2.btask加入到请求队列中,有其他空余线程(atask等线程在正常运行),btask运行(abtask同时运行)
 
 */
- (void)testconcurrentqueueasync {
  dispatch_async(_concurrentqueue,^{
    [self fooa];
    // 同步 需要等待运行结果
    dispatch_async(_concurrentqueue,^{
      [self foob];
    });
    
    // 等待同步代码完成,再运行
    [self fooa];
  });
}

- (void)fooa {
  nslog(@" ************ fooa ************ ");
}

- (void)foob {
  nslog(@" ************ foob ************ ");
}

@end

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网