gpt4 book ai didi

objective-c - 队列和线程如何工作?

转载 作者:搜寻专家 更新时间:2023-10-30 20:03:43 26 4
gpt4 key购买 nike

这与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);

我目前对队列如何工作的理解是队列中的 block 将在该队列的线程上运行。所以两个队列就会变成两个线程。使用多线程,这两个队列将同时发生。但是,“知道了”就在程序收到数据时出现。这是怎么发生的?

如果你想纠正或补充我对线程和队列的理解,请指出。

最佳答案

So two queues will become two threads.

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

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

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

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

关于objective-c - 队列和线程如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com