为什么这个Grand Central Dispatch代码不起作用?

Llu*_*uís -3 concurrency cocoa objective-c grand-central-dispatch

这是我的第一个Grand Central Dispatch代码,但它不起作用.使用Mac OS X 10.8和最新的Xcode版本.我知道这太基础了.谢谢.

#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>

void printResult(int r);

void printResult(int r)
{
    NSLog(@"%i", r);
}

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
        dispatch_async(queue, ^{
            int number = pow(2, 5);
            dispatch_async(dispatch_get_main_queue(), ^{
                printResult(number);
            });
        });
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* N. 5

第一.您的应用程序实际上会您在GCD中传递的块完成之前退出.

要解决此问题,您可以使用他们为您提供的GCD 和同步工具.

@autoreleasepool {
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
    dispatch_group_async(group, queue, ^{
        int number = pow(2, 5);
        dispatch_group_async(group, dispatch_get_main_queue(), ^{
            printResult(number);
        });
    });

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
return 0;
Run Code Online (Sandbox Code Playgroud)

第二.在这里,您将遇到另一个称为死锁的问题.第二个块被添加到主线程队列中.并且主线程实际上正在等待此块完成,因此无法执行.将第二个块添加到之前创建的队列中.

dispatch_group_async(group, queue, ^{
    printResult(number);
});
Run Code Online (Sandbox Code Playgroud)

现在你可以32在控制台中看到,这是你所期望的.