0
int main(void) { 
    dispatch_queue_t queue = dispatch_queue_create(“com.somecompany.queue”, nil); 
    dispatch_sync(queue, ^{ // task 1 
     NSLog(@"Situation 1"); 
    }); 
    return 0; 
} 

これはmain()で正常に実行されます。メインで作成された同期コールのシリアルキューは正常ですが、メインの同期コールメインキューはDEAD-LOCKです

// -------------------------------------------

int main(void) { 
    dispatch_queue_t queue = dispatch_get_main_queue(); 
    dispatch_sync(queue, ^{ // task 1 
     NSLog(@"Situation 2"); 
    }); 
    return 0; 
} 

これはメイン()のDEAD-LOCKです。

// -------------------------------------------

状況2がDEAD-LOCKの間に状況1がOKであるのはなぜですか?どちらもメインスレッドの同期呼び出しシリアルキューです。

または、単にsync()自体がメインキューで実行されるためですか?

答えて

0

最初のケースでは、作成したディスパッチキューでタスクの実行が終了するまでメインキューをブロックするので、問題はありません。

2番目のケースでは、メインキューにタスクをディスパッチしようとしていますが、メインキューはdispatch_syncによってブロックされているため、送信されたクロージャは開始できません。結果はデッドロックです

+0

これは、 'int main(void){NSLog(@" Task 1 "); return 0;} '、' NSLog() 'はメインキューで実行されますか?または 'main()'で実行されるすべての関数がメインキューで実行されますか? – aByn

+0

プログラム内のすべてが、別のキューに明示的にディスパッチするコードを除いて、メインキューで実行されます。メインキューのコードは常にメインスレッド上で実行されます。別のキューにディスパッチされたコードは、メインスレッド上で実行される場合と実行されない場合があります。 – Paulw11

+0

ああそうです! Thx to @ Paulw11、今私は物事を知っている。 – aByn

関連する問題