【问题标题】:Multiple serial Dispatch Queue Not running Concurrentl?多个串行调度队列未同时运行?
【发布时间】:2012-02-09 06:46:46
【问题描述】:

我在 ios 学习并发编程主题。我为多个串行调度队列做了一个示例应用程序。

-(IBAction)SerialDispatchAction:(id)sender
{
    s1queue = dispatch_queue_create( "com.newtok.firstQueue"  ,  NULL);
    s2queue = dispatch_queue_create( "com.newtok.secondQueue" ,  NULL);
    dispatch_async(s1queue, ^{
        int i=0;
        while(i<5)
        {
            printf("First Asynchronous Dispatch Queue.....\n"); 
            sleep(1);
            i++;
        }       
    });         
       dispatch_async(s2queue, ^{
        int i=0;
        while(i<5)
        {
            printf("Second Asynchronous Dispatch Queue.....\n"); 
            sleep(1);
            i++;
        }       
    });    
    dispatch_sync(s1queue ,^{
        int i=0;
        while(i<5)
        {
            printf("First Synchronous Dispatch Queue.....\n");
            sleep(1);            
            i++;
        }        
    });   
    dispatch_sync(s2queue ,^{
        int i=0;
        while(i<5)
        {
            printf("Second Synchronous Dispatch Queue.....\n");
            sleep(1);
            i++;
        }        
    });    

}

我读到,如果您正在创建多个 Dispatch 串行队列,则这些队列是同时运行的。我得到了这样的输出......

First Asynchronous Dispatch Queue.....
Second Asynchronous Dispatch Queue.....
First Asynchronous Dispatch Queue.....
Second Asynchronous Dispatch Queue.....
First Asynchronous Dispatch Queue.....
Second Asynchronous Dispatch Queue.....
First Asynchronous Dispatch Queue.....
Second Asynchronous Dispatch Queue.....
First Asynchronous Dispatch Queue.....
Second Asynchronous Dispatch Queue.....
First Synchronous Dispatch Queue.....
First Synchronous Dispatch Queue.....
First Synchronous Dispatch Queue.....
First Synchronous Dispatch Queue.....
First Synchronous Dispatch Queue.....
Second Synchronous Dispatch Queue.....
Second Synchronous Dispatch Queue.....
Second Synchronous Dispatch Queue.....
Second Synchronous Dispatch Queue.....
Second Synchronous Dispatch Queue.....

dispatch_async 和 dispatch_sync 有什么区别? 它是如何相互浸染的?

【问题讨论】:

    标签: objective-c concurrency grand-central-dispatch dispatch


    【解决方案1】:

    dispatch_sync() 阻塞并确保队列中的所有项目在返回之前已完成运行。 dispatch_async() 只是提交块并立即返回。然后该块是同时运行还是串行运行取决于您将工作提交到哪种队列。正如您正确推测的那样,多个串行队列将彼此同时运行(与队列中的各个块同时运行相反,因为它们将与并发队列一起运行)。

    【讨论】:

      【解决方案2】:

      dispatch_sync 将阻塞线程直到它完成,dispatch_async 提交块并发运行。我建议您重新阅读 GCD 和 this article 上的苹果文档。

      【讨论】:

        【解决方案3】:

        如果您打印出 [NSThread currentThread],您可能会理解 dispatch_sync 有时会优化为在当前线程上运行 - 而不是多个线程。在您的示例中,dispatch_sync 实际上在主线程上运行,因此您发现结果是序列化的。

        【讨论】:

          猜你喜欢
          • 2021-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          • 2019-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多