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 отправьте блоки для запуска одновременно. Я бы рекомендовал вам перечитать документы Apple на GCD и this article.

0

Если вы распечатаете [NSThread currentThread], вы можете понять, что dispatch_sync иногда оптимизируется для запуска в текущем потоке, а не в нескольких потоках. В вашем примере dispatch_sync работает в основном потоке на деле, поэтому вы обнаружите, что результаты сериализованы.