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

时间:2013-01-17 16:26:21

标签: objective-c cocoa concurrency 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;
}

2 个答案:

答案 0 :(得分: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;

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

dispatch_group_async(group, queue, ^{
    printResult(number);
});

现在您可以在控制台中看到32,这正是您所期望的。

答案 1 :(得分:0)

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        dispatch_queue_t queue = dispatch_queue_create("com.myQueue", NULL);
        dispatch_async(queue, ^{
            int number = pow(2, 5);
            dispatch_async(dispatch_get_main_queue(), ^{
                printResult(number);
            });
        });
    }
    [[NSRunLoop currentRunLoop] run]; 
    return 0;
}

我认为你只需要一个runloop。