最近總是忙著忙那,好久沒動過筆了,
dispatch_semaphore_create,dispatch_semaphore_wait,dispatch_semaphore_signal在多線程中控制多線程的并發(fā)數(shù)目,也可以達(dá)到線程鎖的功效,先大致的說下他們每個的作用.
? ? dispatch_semaphore_create(long value):代表信號總量(信號就是你想每次執(zhí)行幾個任務(wù))
? ? dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout):等待信號,可以設(shè)置超時參數(shù).如果信號量>0,那么會繼續(xù)執(zhí)行,并且總的信號量-1;如果信號量=0,則會阻塞當(dāng)前的線程
? ? dispatch_semaphore_signal(dispatch_semaphore_t dsema):通知信號,如果等待線程被喚醒則返回非0,否則返回0.并且會讓信號總量+1.
下面說說用法
一.比如我現(xiàn)在想執(zhí)行10個任務(wù),休息兩秒后呢,繼續(xù)執(zhí)行10各任務(wù),再休息兩秒,在執(zhí)行...可以這么做(如圖1.1):
簡單解釋下上面圖片中代碼的意思:創(chuàng)建了一個初使值為3的semaphore,每一次for循環(huán)都會創(chuàng)建一個新的線程,線程結(jié)束的時候會發(fā)送一個信號,線程創(chuàng)建之前會信號等待,所以當(dāng)同時創(chuàng)建了10個線程之后,for循環(huán)就會阻塞,等待有線程結(jié)束之后會增加一個信號才繼續(xù)執(zhí)行,如此就形成了對并發(fā)的控制,如上就是一個并發(fā)數(shù)為3的一個線程隊列.
二:生產(chǎn)者---消費(fèi)者模式
如圖2.2
簡單說下上面代碼:創(chuàng)建了兩個并發(fā)隊列,semaphore初始值設(shè)為1,兩個隊列的執(zhí)行情況:1.生產(chǎn)隊列執(zhí)行到if時候,信號總量變?yōu)?,并生產(chǎn)了第一個蛋糕,并睡兩秒,2.消費(fèi)者隊列執(zhí)行到等待信號的時候,信號總量0,阻塞當(dāng)前線程,一直等到消費(fèi)者隊列執(zhí)行完通知信號是,信號總量變?yōu)?,繼續(xù)執(zhí)行,拿到了蛋糕,信號總量再次變?yōu)?.
三:應(yīng)用簡單示例:同步下載9張圖片,下載完一張顯示一張(線程鎖的功能)
代碼下面會附上demo,簡單說下實(shí)現(xiàn):首先把信號總量設(shè)為1,并創(chuàng)建了9個線程,每個線程負(fù)責(zé)現(xiàn)在一張圖片,下載圖片的時候開啟等待信號,下載完成后更新界面,并發(fā)送通知信號
參考鏈接:http://www.iosxxx.com/blog/2016-06-02-GCD%E9%82%A3%E4%BA%9B%E4%BA%8B.html