ios - GCD 串行线程执行流程

标签 ios multithreading grand-central-dispatch

在下面的示例函数中

    -(void)testThred{
    dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^{
        NSLog(@"1");
    });
     NSLog(@"2");

    dispatch_async(serialQueue, ^{
        NSLog(@"3");
    });
NSLog(@"4");

}

输出如下2,1,4,3

据我所知它将是 2, 4 ,1,3 任何人都知道

最佳答案

这里唯一保证的顺序是 4 将在 2 之后发生,3 将在 1 之后发生。这是因为您的自定义队列和主队列都是串行的 - 因此 block 将按照它们的顺序执行已安排。

但是,因为您的 serialQueue 正在后台线程上执行 block (尝试记录当前线程)——您的 1 和 3 操作与您的 2 和 4 同时发生操作。

因此,串行队列上的操作与主队列上的操作之间的确切顺序是不确定的。

如果您将 dispatch_async 更改为分派(dispatch)到主队列,那么您确实会得到您想要的顺序(2、4、1、3)——因为您调度的 block 必须等待主队列完成其当前任务的执行(您的 2 和 4 操作 + 主队列正在执行的任何其他操作)。

关于ios - GCD 串行线程执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37087296/

相关文章:

ios - Iphone Ad Hoc 分发配置文件更新

java - Java 中的简单多线程

java - 通过 processbuilder 进行多进程通信,卡住在 BufferedReader() 的 readline() 处

ios - GCD机制是在哪里调用的呢?

ios - 点播资源上传失败

iphone - Objective-C block 停止 UIGestureRecognizer

java - 谷歌数据流: set a DefaultUncaughtExceptionHandler

ios - 使用 swift 在 ios 中线程之间通信的最佳方式是什么?

ios - 忽略连续的 performSelector :withObject:afterDelay: by checking for queue messages

ios - 最佳实践?从 segues 传回对象引用