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");
    });

  程序的輸出結果:

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");
    });

  程序輸出結果:

step1
step2

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

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

 

  參考資料:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章