使用GCD在程序上获取单个主线程

时间:2015-02-18 21:46:22

标签: grand-central-dispatch libdispatch

使用this作为参考框架,是否有任何理由说明为什么以下示例{不能} / {不会导致GCD线程池专门在主线程上运行?

int main()
{
    dispatch_queue_t myQueue = dispatch_queue_create("myQ",NULL); // create serial queue

    //
    dispatch_sync(myQueue, ^{/*some simple block*/});
    ....
    dispatch_sync(myQueue, ^{/*some simple block*/});
} 

我的理解是GCD会尽可能地优化性能,将块(当有用时)交给任何可用的线程。但是,在xcode中监视它会显示这可能只在主线程上运行。直到调度调用变为async,才会使用第二个线程。

我想了解何时/为什么可能会调用或不调用第二个线程。在此之前,我假设将始终调用第二个线程。

1 个答案:

答案 0 :(得分:0)

您正在使用dispatch_sync调度块。 dispatch_sync一直等到块执行完毕。所以你所做的事情毫无意义,除非你使用该串行队列进行同步。没有任何并发​​性。相反,如果已经在串行队列上执行了代码并且可能已经分派给它的块,那么主线程必须等到运行块和所有进一步调度的块完成,然后等到块完成。

如果你调用了dispatch_async,那么这两个块将被调度到串行队列,将一个接一个地执行(使用一个CPU),而你的主线程将继续使用另一个CPU做其他事情。

如果您将dispatch_async调用到并发队列,那么这两个块将并行执行,而您的主线程可以使用最多三个CPU执行其他操作。

现在你的代码将“正式”在另一个线程上运行你的块,而主线程被阻塞。由于螺纹开关很昂贵,因此尽可能避免使用它们。因此,dispatch_sync到串行队列将检查队列是否为空,如果它是空的,它将阻止队列调度,在调用线程上执行块,然后取消阻塞队列。行为与调度块的行为完全相同,但执行速度更快。