저는 iPhone 개발의 최신 버전이며 멀티 스레딩을위한 GCD 개념을 사용합니다.dispatch_queue_t가 직렬 큐인 경우 멀티 태스크 개념에 왜 존재합니까?
'dispatch_queue_t'는 직렬 대기열을 만들고 직렬 대기열은 한 번에 하나의 작업 만 실행한다는 것을 읽었습니다. GCD는 여러 작업을 동시에 실행하고 직렬 대기열이 존재하는 이유는 무엇입니까?
예를 들어 2 가지 작업을 수행하고 싶습니다. 작업 A와 작업 B.이 작업을 모두 실행하기 위해 하나의 직렬 대기열을 만듭니다. 나는 메인 큐에서 이것을하고있다.
dispatch_queue_t my_serial_queue = dispatch_queue_create("queue_identifier", 0);
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue, ^{
NSLog(@"Task 2");
});
규칙에 따라 경찰, 이제 모두가 시리얼 큐 즉, 작업 A가 먼저 다음 작업 A를 완료 한 후, 작업 B 실행되는대로 작업이 순차적으로 실행됩니다 : 여기에 내가 뭐하는 거지 코드입니다 실행됩니다. 또한 로그에서 동일한 출력을 제공합니다.
내 질문은, 두 작업을 동시에 실행하려면 어떻게합니까? 이 질문의 대답이 작업 B의 다른 직렬 대기열을 만드는 것이라면 코드는 다음과 같이 구성되어야합니다.
dispatch_queue_t my_serial_queue_1 = dispatch_queue_create("queue_identifier_1", 0);
dispatch_queue_t my_serial_queue_2 = dispatch_queue_create("queue_identifier_2", 0);
dispatch_sync(my_serial_queue_1, ^{
NSLog(@"Task 1");
});
dispatch_sync(my_serial_queue_2, ^{
NSLog(@"Task 2");
});
동일한 출력을 얻고 있습니다. 이유는 'dispatch_async'호출 대신 'dispatch_sync'호출을 사용하고 있습니다. 그러나 두 작업을 다른 대기열에서 실행 중이므로 동시에 실행하면 안됩니까? 그렇지 않다면 다른 큐를 만들어야하는 이유는 무엇입니까? 두 작업을 동시에 실행하기 위해 'dispatch_async'호출에 의해 같은 큐를 사용했을 수도 있습니다.
내 멀티 태스킹 응용 프로그램의 구조를 설계하기 전에 미래에 나에게 더 나은 지침이 될 것이므로이 질문에 대한 답이 정말 필요합니다.
감사합니다. 미리 감사드립니다.
@ Catfish_Man : 간단히 말해서 내가 말한 2 가지 작업을 완전히 동시에 수행하려면 직렬 대기열에서 'dispatch_async'를 사용하거나 (2) 두 작업에 대해 2 개의 동시 대기열을 생성해야합니다. 'dispatch_queue_t'에 의해 2 개의 큐를 생성하는 것이 아니라 ('dispatch_queue_t'가 직렬 큐를 생성하기 때문에). – NSPratik
@ Catfish_Man :이 두 가지 작업이 완전히 독립적이라고 가정합니다. – NSPratik
하나의 동시 대기열 또는 두 개의 연속 대기열. 직렬 대기열은 모든 항목을 순서 지정하지만 다른 모든 대기열과 동시에 수행합니다. 동시 대기열은 전혀 대기열을 지정하지 않습니다. –