2012-02-09 21 views
1

我学习了ios中的并发编程主题。我为多个串行调度队列做了一个示例应用程序。多个串行调度队列没有运行Concurrentl?

-(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有什么区别? 它是如何相互压抑?

回答

1

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

0

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

0

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