1

학습 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++; 
     }   
    });  

} 

여러 개의 디스패치 직렬 대기열을 만드는 경우 대기열이 동시에 실행되고 있습니다. 나는 이걸 넣어 놨어 ....

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는 증서의 주 스레드에서 실행되므로 결과가 직렬화되어 있습니다.