-3

这是我的第一个 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;
}
4

2 回答 2

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在控制台中看到,这是您所期望的。

于 2013-01-17T16:50:41.613 回答
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;
}

我认为你只需要一个运行循环。

于 2013-04-24T17:03:31.613 回答