-1

異なるタスクで同じキューでdispatch_asyncメソッドを2回呼び出すと、両方のタスクの同じスレッドではなく、異なるスレッドでタスクが実行されます。

void(^myBlock)(void) = ^{
  for(int i = 0;i < 10 ; i++)
  {
     NSLog(@"%d and current queue = %@",i,[NSThread currentThread]);   
  }
};

-(void)viewDidLoad   
{
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_
    DEFAULT, 0);

    dispatch_async(queue,myBlock);    
    dispatch_async(queue,myBlock);
}

このプログラムを実行すると、2 つのスレッドが作成されます。以下が出力です。

2013-09-10 17:45:20.435 ConcurrencyDemo[1331:30b] 0 および現在のキュー = {name = (null), num = 3}
2013-09-10 17:45:20.435 ConcurrencyDemo[1331:1603] 0 および現在のキュー = {name = (null)、num = 2}
2013-09-10 17:45:20.438 ConcurrencyDemo[1331:1603] 1 および現在のキュー = {name = (null)、num = 2}
2013-09- 10 17:45:20.438 ConcurrencyDemo[1331:30b] 1 および現在のキュー = {name = (null), num = 3}
2013-09-10 17:45:20.440 ConcurrencyDemo[1331:1603] 2 および現在のキュー = {名前 = (ヌル)、数値 = 2}
2013-09-10 17:45:20.440 ConcurrencyDemo[1331:30b] 2 および現在のキュー = {名前 = (ヌル)、数値 = 3}
2013-09-10 17:45 :20.441 ConcurrencyDemo[1331:1603] 3 および現在のキュー = {name = (null), num = 2}
2013-09-10 17:45:20.441 ConcurrencyDemo[1331:30b] 3 および現在のキュー = {name = (null), num = 3}
2013-09-10 17:45:20.442 ConcurrencyDemo[1331:30b] 4 および現在のキュー = {name = (null)、num = 3}
2013-09-10 17:45:20.442 ConcurrencyDemo[1331:1603] 4 および現在のキュー = {name = (null)、num = 2}
2013-09- 10 17:45:20.443 ConcurrencyDemo[1331:1603] 5 および現在のキュー = {name = (null), num = 2}
2013-09-10 17:45:20.443 ConcurrencyDemo[1331:30b] 5 および現在のキュー = {名前 = (null)、num = 3}
2013-09-10 17:45:20.444 ConcurrencyDemo[1331:30b] 6 および現在のキュー = {name = (null)、num = 3}
2013-09-10 17:45 :20.444 ConcurrencyDemo[1331:1603] 6 および現在のキュー = {name = (null), num = 2}
2013-09-10 17:45:20.445 ConcurrencyDemo[1331:30b] 7 および現在のキュー = {name = (null), num = 3}
2013-09-10 17:45:20.445 ConcurrencyDemo[1331:1603] 7 および現在のキュー = {name = (null)、num = 2}
2013-09-10 17:45:20.446 ConcurrencyDemo[1331:1603] 8 および現在のキュー = {name = (null)、num = 2}
2013-09- 10 17:45:20.446 ConcurrencyDemo[1331:30b] 8 および現在のキュー = {name = (null), num = 3}
2013-09-10 17:45:20.448 ConcurrencyDemo[1331:30b] 9 および現在のキュー = {名前 = (ヌル)、数値 = 3}
2013-09-10 17:45:20.448 ConcurrencyDemo[1331:1603] 9 および現在のキュー = {名前 = (ヌル)、数値 = 2}

なぜこれが起こっているのか誰にも教えてもらえますか?

4

1 に答える 1

4

ディスパッチされたブロックのスレッドへの割り当ては、内部実装の詳細です。常にメイン スレッドで実行されるメイン キューを除いて、特定のスレッドを使用するシステムに依存することはできません。

ただし、この特定のケースでは、このスレッドの状況はまさに予想どおりです。メイン キュー以外のグローバル キューは同時キューです。したがって、ハードウェアの制限内で、システムに配置したすべてのブロックを同時に効率的に処理するのに十分なスレッドをシステムが作成することを期待する必要があります。何が起こると思っていましたか?

特定の質問に対しては、 dispatch_async「このブロックをキューに入れ、すぐに戻る」ことを意味します。dispatch_sync「このブロックをキューに入れ、実行されるのを待ってから戻る」ことを意味します。

于 2013-09-10T12:35:04.227 に答える