队列和线程如何工作?

时间:2011-12-25 09:24:44

标签: objective-c multithreading grand-central-dispatch

这与objective-c中使用的Grand Central Dispatch API有关,具有以下代码:

dispatch_queue_t downloadQueue = dispatch_queue_create("other queue", NULL);
dispatch_async(downloadQueue, ^{
    ....some functions that retrieves data from server...
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"got it");
    });
});
dispatch_release(downloadQueue);

我目前对队列如何工作的理解是队列中的块将进入该队列的线程。所以两个队列将成为两个线程。使用多线程,这两个队列将同时发生。 但是,当程序收到数据时,“得到它”就出现了。这是怎么发生的?

请指出您是否要更正或添加我对线程和队列的理解。

1 个答案:

答案 0 :(得分:5)

  

因此两个队列将成为两个线程。

不一定。 GCD的一个优点是系统根据可用CPU核心数量和其他因素动态决定它创建的线程数。很可能两个自定义队列在同一个后台线程上执行,特别是如果两个队列中的任务很少等待执行。

您唯一可以确定的是,串行队列永远不会同时使用多个线程。因此,您添加到同一(串行)队列的任务将始终按顺序执行。对于使用dispatch_get_global_queue()获得的三个并发全局队列,情况并非如此。

此外,主队列(您使用dispatch_get_main_queue()访问的队列)始终绑定到主线程。它是唯一一个在程序的主线程上执行任务的队列。

在您的示例中,downloadQueue的任务在后台线程上执行。一旦代码到达dispatch_async(dispatch_get_main_queue(), ^{,GCD就会将这个新任务推送到主线程,在主线程中,如果主线程不忙于其他事情,它将立即执行。