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