/**
假设有A、B、C三个操作,要求:
1. 3个操作都异步执行
2. 操作C依赖于操作B
3. 操作B依赖于操作A
*/
- (void)dependency{
//创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 3; //可开辟线程的最大数量
//创建三个任务
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"A任务当前线程为:%@", [NSThread currentThread]);
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"B任务当前线程为:%@", [NSThread currentThread]);
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"C任务当前线程为:%@", [NSThread currentThread]);
}];
//设置任务相互依赖
[operationB addDependency:operationA];
[operationC addDependency:operationB];
//添加到操作队列中(自动异步执行任务,并发)
[queue addOperation:operationA];
[queue addOperation:operationB];
[queue addOperation:operationC];
}
- (void)GCDSemaphore{
/*
dispatch_semaphore_signal 这个函数会使传入的信号量的值加1
dispatch_semaphore_wait 这个函数会使传入的信号量的值减1
*/
NSMutableArray *arr = [NSMutableArray array];
//创建信号量,值为0
dispatch_semaphore_t semaphore0 = dispatch_semaphore_create(0);
dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);
//thread3
//希望它是最后执行的,让它依赖thread2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//DISPATCH_TIME_FOREVER表示一直等着,直到semaphore为0执行.
//如果写15的话,就代表我只等15纳秒,15纳秒后,不管信号量是否为0,都执行下面的代码.
//阻塞当前线程一直到semaphore1为0
dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
NSLog(@"最弱的,最后执行");
});
//thread2
//等待thread1执行完毕后,执行thread2.(thread2依赖thread1)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//wait信号量-1(少一个可用资源)
dispatch_semaphore_wait(semaphore0, DISPATCH_TIME_FOREVER);
NSLog(@"依赖别人的资源");
dispatch_semaphore_signal(semaphore1);
});
//thread1
//这里有arr的赋值操作,需要最先执行,否则其他地方打印都为空
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
for(int i = 0; i < 3; i ++)
{
[arr addObject:[NSNumber numberWithInt:i]];
}
NSLog(@"被依赖的资源 ---> %@",arr);
//signal相当于信号量+1(多一个可用资源)
dispatch_semaphore_signal(semaphore0);
});
}