并发的简单介绍1
介绍:
当两个或两个以上的任务同时执行时就发生了并发. 即使只有一个CPU,现代操作系统也能够在同时执行多个任务.要实现这一点,需要给每个任务从CPU重分配一定的时间片 .例如,要在1秒内执行10个同样有限级的人物,操作系统会用10来平均分配1000毫秒,那么每个任务就会有100毫秒的CPU 时间.
随着技术进步,现在的CPU有不止一个内核,这就意味着CPU真正具备了同时执行多个任务的能力.
Grand Central Dispatch(dispatch [派遣,分派]),简称GCD,是一个与Block Object一起工作的底层C API .GCD真正的用途是将任务分配到多个核心又不让程序员担心哪个内核执行哪个任务.
GCD的核心是分派队列.你不会直接与线程有工作关系,你只在分派队列上的工作,将任务分派到这个队列上并要求队列来调用你的任务.GCD为运行任务提供了几个选择:同步执行 异步执行 延迟执行等.
要在APP中开始使用GCD,你没有必要将任何特殊库导入你的项目.GCD中的所有方法和数据类型都以 dispatch_关键词开头。例如,dispatch_async 允许你在一个队列上分派任务来异步执行,而 dispatch_after 允许你在一个给定的延迟之后运行一个 block。
不用GCD和operation,程序员必须创建自己的线程来并行执行任务。例如,一个 iOS 开发者会创建一个与下面这个类似的线程就要执行一个操作 1000 次:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /*Start the thread detach [dɪ'tætʃ] 分离,派遣*/ [NSThread detachNewThreadSelector:@selector(calculationThreadEntry) toTarget:self withObject:nil]; return YES; } - (void)calculationThreadEntry{ @autoreleasepool { NSUInteger counter = 0; while ([[NSThread currentThread]isCancelled] == NO) { [self doCalculation]; NSLog(@"%lu",(unsigned long)counter); counter++; if (counter >= 1000) { break; } } } } - (void)doCalculation{ }
程序员必须开始手动写线程,然后为线程创建要求的结构(切入点,autorelease pool和 线程的主循环)。当我们在 GCD 写同样的代码时,就没有必要做这么多事情。我们只需要 简单的将代码放在一个 block 对象中,然后将这个 block 分派给 GCD 来执行即可。至于相关 代码是在主线程或者其它线程执行,这取决于我们自己。下面是一个示例:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); size_t numberOfIterations = 1000; dispatch_async(queue, ^{ dispatch_apply(numberOfIterations, queue, ^(size_t iteration) { /**/ }); });