多个串行调度队列未运行Concurrentl



我在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之间有什么区别?它是如何相互渗透的?

dispatch_sync()阻塞,并确保队列中的所有项目在返回之前都已完成运行。dispatch_async()只需提交块并立即返回。块是并发运行还是串行运行取决于您将工作提交到哪种队列。正如您正确推测的那样,多个串行队列将彼此并发运行(而不是队列上的单个块与并发队列同时运行)。

dispatch_sync将阻塞线程,直到线程完成,dispatch_async提交块以并发运行。我建议你重新阅读关于GCD的苹果文档和这篇文章。

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

最新更新