队列和线程如何工作?

Wil*_*ham 3 multithreading objective-c 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Ole*_*ann 5

所以两个队列将成为两个线程.

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

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

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

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

  • "它是唯一一个任务*保证在程序的主线程上执行的队列."从主线程到另一个队列的dispatch_sync()通常会在不创建另一个执行线程的情况下执行,即在主线程上执行. (2认同)