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/