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

Getting single main-thread on program using GCD

使用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 才使用第二个线程。

我只想了解 when/why 可能会或可能不会调用第二个线程。在此之前,我假设总是会调用第二个线程。

您正在使用 dispatch_sync 调度块。 dispatch_sync 等到块执行完毕。所以你所做的是毫无意义的,除非你使用那个串行队列来进行同步。不能有任何并发​​。相反,如果已经在串行队列上执行了代码并且可能已经向其分派了块,则您的主线程将不得不等到 运行ning 块和所有进一步分派的块完成,然后等待直到你的积木完成。

如果你调用dispatch_async,那么这两个块将被分派到串行队列,一个接一个地执行(使用一个CPU),而你的主线程会继续做其他的东西,用其他的CPU。

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

现在您的代码将 "officially" 运行 您的代码阻塞在另一个线程上,而主线程被阻塞。由于线程切换很昂贵,因此尽可能避免使用它们。所以dispatch_sync到串行队列会检查队列是否为空,如果为空则阻塞队列调度,在调用线程上执行阻塞,然后解阻塞队列。行为与分派块完全相同,但执行速度更快。