GCD多线程-dispatch_async与dispatch_sync的区别

从async和sync的字面上区分,async是异步的简称,sync是同步的简称。

1、dispatch_async意味着异步处理,主程序不会等待block块执行结果。

int main(int argc, const char * argv[]) {
    dispatch_queue_t queueMain = dispatch_get_main_queue();
    dispatch_async(queueMain, ^{
        NSLog(@"+++++++");});
    NSLog(@"hahahaha");
    return 0;
}

输出结果:hahahaha

结果中未输出+++++++

结果分析:异步执行并不影响main线程的执行,block会添加到main队列最后。但是由于直接运行到return行,所以main线程被杀死,并未执行添加到main线程的block块。如果在app工程中,会先输出hahahaha,再输出+++++++。

2、dispatch_sync意味着同步处理,主程序必须等block块执行完毕后,才能继续往下执行。

    dispatch_queue_t queueMain = dispatch_get_main_queue();
    dispatch_sync(queueMain, ^{
        NSLog(@"+++++++");});
    NSLog(@"hahahaha");

程序停在dispatch_sync()行。

结果分析:由于main线程执行到dispatch_sync()处,就处于等待状态。将block块添加到main队列,等待当前mian线程中的任务执行完毕后,执行block块。导致两边都在等待,所以出现死锁,程序卡住。

时间: 2024-10-11 18:05:36

GCD多线程-dispatch_async与dispatch_sync的区别的相关文章

GCD - 多线程

什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一个库,为并发代码在多核硬件(跑 iOS 或 OS X )上执行提供有力支持.它具有以下优点: 1.GCD 能通过推迟昂贵计算任务,并在后台运行它们改善应用的响应性能. 2.GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱. 3.GCD 具有在常见模式(例如单例),用更高性能的原语优化你的代码. GCD 术语 Serial vs. Concurrent 串

GCD 多线程API编程笔记

GCD 是 iOS 编程中实现多线程的常用 API,使用方便,无须进行线程的管理,由系统代劳.同时GCD基于C实现,性能强. 在名著<Pro multithreading and memory management for iOS and OS X>(中文名:<Objective-C 高级编程 iOS与 OSX多线程和内存管理>)中,专门有章节讲解,特根据此书讲解做些笔记. 一 概要 GCD是Grand Central Dispatch(GCD)的缩写,是异步执行任务的技术之一.一

iOS开发之GCD 多线程 1.串行队列 2.并行队列 3.分组 4.信号量 详细讲解

GCD多线程下,实现线程同步的方式有如下几种: 1.串行队列 2.并行队列 3.分组 4.信号量 实例: 去网上获取一张图片并展示在视图上. 实现这个需求,可以拆分成两个任务,一个是去网上获取图片,一个是展示在视图上. 这两个任务是有关联的,所以需要同步处理. 下面看这几种方式如何实现. 一. 1.串行队列 1.1[GCD相关:] (1)GCD下的dispatch_queue队列都是FIFO队列,都会按照提交到队列的顺序执行. 只是根据队列的性质,分为<1>串行队列:用户队列.主线程队列 &l

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

java 多线程sleep和wait的区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备 获取对象锁进入运行状态. 什么意思呢?

GCD多线程死锁总结

// //  ViewController.m //  多线程 // // #import "ViewController.h" @interface ViewController () @end @implementation ViewController /* >1 队列和线程的区别: 队列:是管理线程的,相当于线程池,能管理线程什么时候执行. 队列分为串行队列和并行队列 串行队列:队列中的线程按顺序执行(不会同时执行) 并行队列:队列中的线程会并发执行,可能会有一个疑问,队

GCD多线程的使用(一)

苹果官方给的解释是:Grand Central Dispatch(GCD)是异步执行任务的技术之一.GCD的线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,比以前的线程更有效率,这也是苹果推荐使用的技术. 苹果官方对GCD的说明:开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中.这句话有三个关键点: 1.想执行的任务. 2.追加. 3.适当的Dispatch Queue. 用代码比较好说明这三点: dispatch_async(queue, ^{

GCD多线程

1 // 2 // ViewController.m 3 // NSThread 4 // 5 // Created by ys on 15/11/22. 6 // Copyright (c) 2015年 ys. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 13 @end 14 15 @implementation ViewControlle

iOS GCD多线程介绍

GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案. GCD的两个核心概念: - 任务 - 队列 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 - 创建串行队列 // "WE" 为线程的名称 // DISPATCH_QUEUE_SERIAL 串行 dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QU