IOS深刻理解GCD之dispatch_sync

void dispatch_sync( dispatch_queue_t queue, dispatch_block_t block);

  dispatch_sync_的定義如上所示,將block添加到queue中,無論queue是並行隊列仍是串行隊列,block的執行知足FIFO須要等待先進入queue中的block執行完以後才能被執行,在同一個queue中同一時刻只能有一個block執行。併發

//建立一個並行隊列
    dispatch_queue_t queue2 = dispatch_queue_create("concurrent.dispatch.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue2, ^{
        NSLog(@"step0");
    });
    
    //建立一個串行隊列
    dispatch_queue_t queue1 = dispatch_queue_create("serial.dispatch.queue", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue1, ^{
        NSLog(@"step1");
    });
    dispatch_sync(queue1, ^{
        NSLog(@"step2");
    });

  程序的輸出結果:spa

step0
step1
step2

  若是queue是一個並行隊列,理論上並行隊列中的block應該並行,可是經過實驗驗證,queue中的block是串行執行的,爲何?難道是我理解錯了線程

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent.dispatch.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"step1");
    });
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"step2");
    });

  程序輸出結果:3d

step1
step2

  由此能夠得出結論,對於併發隊列而言,若是做爲參數傳入到dispatchsync中,那queue中的block是串行執行的,根據深刻理解dispatchsync中的描述,在調用dispatchsync時,在底層是對queue進行了加鎖,在一個block執行完以後才能取其餘的block來執行。這樣就不可以發揮出並行隊列的併發執行的價值。code

寫這篇博客時仍是有一個沒有理解到的問題,既然dispatchsync是串行執行,而且要阻塞當前線程,那麼直接在當前線程中執行block的代碼就能夠了,那麼dispatchsync就沒有存在的意義了,這點沒有想明白,why?blog

 

  參考資料:隊列

http://zhangbuhuai.com/2015/04/11/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3dispatch_sync/get

相關文章
相關標籤/搜索