-3

これは私の最初のグランド セントラル ディスパッチ コードですが、機能しません。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;

2番。ここで、デッドロックと呼ばれる別の問題が発生します。2 番目のブロックがメイン スレッド キューに追加されます。メインスレッドは実際にはこのブロックが終了するのを待っているため、実行できませんでした。前に作成したキューに 2 番目のブロックを追加します。

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 に答える