2017-12-01 4 views
2

NSMainQueueConcurrencyTypeおよびNSPrivateQueueConcurrencyTypeで初期化された管理オブジェクトコンテキストは、操作がFIFO順に実行されるシリアルキューであるメインキューおよびプライベートキューと結びついています。NSMainQueueConcurrencyTypeコンテキストとNSPrivateQueueConcurrencyTypeコンテキストの同時実行性?

NSLog(@"Current thread : %@", [NSThread currentThread]); 

[mainMoc performBlock:^{ 
    NSLog(@"main 1 - %@", [NSThread currentThread]); 

}]; 

[mainMoc performBlockAndWait:^{ 
    NSLog(@"main 2 - %@", [NSThread currentThread]); 

}]; 

[mainMoc performBlock:^{ 
    NSLog(@"main 3 - %@", [NSThread currentThread]); 

}]; 

[bgMoc performBlock:^{ 
    NSLog(@"bg 1 - %@", [NSThread currentThread]); 

}]; 

[bgMoc performBlockAndWait:^{ 
    NSLog(@"bg 2 - %@", [NSThread currentThread]); 

}]; 

[bgMoc performBlock:^{ 
    NSLog(@"bg 3 - %@", [NSThread currentThread]); 

}]; 

が、私はそれがシリアル順に

main 1main 2main 3bg 1のような、bg 2bg 3を印刷するように期待していたが、代わりに、これは印刷された:以下のサンプルコードでは

Current thread : <NSThread: 0x60000006fb80>{number = 1, name = main} 
main 2 - <NSThread: 0x60000006fb80>{number = 1, name = main} 
bg 1 - <NSThread: 0x600000268900>{number = 3, name = (null)} 
bg 2 - <NSThread: 0x60000006fb80>{number = 1, name = main} 
bg 3 - <NSThread: 0x600000268900>{number = 3, name = (null)} 
main 1 - <NSThread: 0x60000006fb80>{number = 1, name = main} 
main 3 - <NSThread: 0x60000006fb80>{number = 1, name = main} 

舞台裏の理論は何だろうかnとプライベートキューはシリアルですか?

答えて

2

同時性は非決定的です。あなたが保証している唯一のことは、 "main1"が "main3"の前に実行されているということです。

performBlockperformBlockAndWaitを区別することが重要です。

performBlockは非同期なので、ブロックをキューに入れてすぐに戻ります。これらのブロックは順番に実行されます。それはなぜ "main1"が "main3"の前に常に実行されるのかということです。

performBlockAndWaitは同期しているため、定義によってキューを処理することはできません。これは今ブロックを実行することを意味し、完了するまで戻ってこない。 キューが空でないか、キュー内の他のすべてのタスクを最初に実行する必要があるため、これを実行しなかった場合はブロックされます。

"bg1"が "bg2"の前に来る理由は、スケジューリングです。私はほとんど確信しています。あなたがこのテストを何度も実行すると、最終的には違うかもしれません。 メインスレッドが同期「bg2」に達するのが早ければ、最初に現れます。

関連する問題