看了很多文章,總有自己的一套摹量。套套不同臣疑。
case1
在開發(fā)中盔憨,我們經常會用到針對一個數據存儲的多讀單寫功能。dispatch_barrier_async就能實現該功能讯沈,保證你在讀的過程中可以多并發(fā)郁岩,寫的過程中可以阻塞其他操作婿奔。
http://www.reibang.com/p/2d25ad26680d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
case2
怎樣實現多讀單寫?
比如在內存中維護一份數據问慎,有多處地方可能會同時操作這塊數據萍摊,怎么能保證數據安全?
1.讀寫互斥
2.寫寫互斥
3.讀讀并發(fā)
要想滿足上面的三點該怎么實現呢如叼?
http://www.reibang.com/p/be2e405f952c
case3
首先冰木,我們需要創(chuàng)建一個私有的并行隊列來處理讀寫操作。
在這里不應該使用globe_queue, 因為我們通過dispatch_barrier_async來保證寫操作的互斥笼恰,我們不希望寫操作阻塞住globe_queue中的其他不相關任務踊沸,我們只希望在寫的同時,不會有其他的寫操作或者讀操作社证。
同時逼龟,也不推薦給隊列設置優(yōu)先級,多數情況下使用default就可以了追葡。而改變優(yōu)先級往往會造成一些無法預料的問題腺律,比如優(yōu)先級反轉(具體的可以參看參考文獻)。
dispatch_barrier_async的block運行時機是宜肉,在它之前所有的任務執(zhí)行完畢匀钧,并且在它后面的任務開始之前,期間不會有其他的任務執(zhí)行崖飘。注意在barrier執(zhí)行的時候榴捡,隊列本質上如同一個串行隊列杈女,其執(zhí)行完以后才會恢復到并行隊列朱浴。
另外一個值得注意的問題是,在寫操作的時候达椰,我們使用dispatch_async翰蠢,而在讀操作的時候我們使用dispatch_sync。很明顯啰劲,這2個操作一個是異步的梁沧,一個是同步的。我們不需要使每次程序執(zhí)行的時候都等待寫操作完成蝇裤,所以寫操作異步執(zhí)行廷支,但是我們需要同步的執(zhí)行讀操作來保證程序能夠立刻得到它想要的值。(寫操作是異步栓辜,不需要等待結果恋拍,直接返回;讀操作是同步藕甩,需要等待讀結果施敢,是同步)。