5

この質問をする最良の方法は、いくつかのコードを使用することだと思います。

//Main method
for(int i = 0; i < 10; i++)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self foo:i];
    });

}

- (void) foo: (int) i
{
    @synchronized(self)
    {
        NSLog(@"%d",i);
    }
}

この場合、0~9の数字が順番に出力されることが保証されていますか? 実行キューで待機しているスレッドの 1 つがスキップされる可能性はありますか? 現実的にはどうでしょう。現実的に、それは起こりますか?上記の動作が必要な場合 (まだスレッドを使用); どうすればこれを達成できますか?

4

2 に答える 2

15

この場合、0~9の数字が順番に出力されることが保証されていますか?

いいえ。

実行キューで待機しているスレッドの 1 つがスキップされる可能性はありますか?

「スキップオーバー」の意味が不明。「ブロックは順番に実行されますか?」という意味であれば。答えは「おそらく、しかしそれは実装の詳細です」です。

現実的にはどうでしょう。現実的に、それは起こりますか?

無関係。現実的な実装の詳細に関する仮定に基づいて同時実行コードを記述している場合は、誤った同時実行コードを記述しています。

上記の動作が必要な場合 (まだスレッドを使用); どうすればこれを達成できますか?

シリアル ディスパッチ キューを作成し、必要な順序でそのキューにディスパッチします。これはよりもかなり高速であることに注意してください@synchronized()(もちろん、@synchronized()順序を保証するのではなく、排他性を保証するだけなので、とにかくうまくいきません)。

于 2013-04-08T15:50:28.650 に答える