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