http://www.cnblogs.com/snailHL/p/3906112.html
dispatch_semaphore是GCD用來(lái)同步的一種方式股囊,與它相關(guān)有三個(gè)函數(shù):
dispatch_semaphore_create, dispatch_semaphore_signal, dispatch_semaphore_wait
(1) dispatch_semaphore_create聲明:
dispatch_semaphore_t dispatch_semaphore_create(long value);
傳入?yún)?shù)為long火鼻,輸出一個(gè)dispatch_semaphore_t類型且值為value的信號(hào)量
注意:傳入?yún)?shù)value必須大于或等于0碎节,否則dispatch_semaphore_create返回NULL
(2)dispatch_semaphore_signal聲明:
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值加1
(3)dispatch_semaphore_wait聲明:
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout );
這個(gè)函數(shù)使傳入信號(hào)量dsema值減1
函數(shù)作用:
如果dsema信號(hào)量值大于0媒峡,該函數(shù)所處線程繼續(xù)執(zhí)行下面語(yǔ)句嚷炉,并且將信號(hào)量值減1捅厂;
如果dsema值為0避乏,函數(shù)就阻塞當(dāng)前線程等待timeout爷耀,等待期間desma值被dispatch_semaphore_signal函數(shù)加1了,且該函數(shù)(dispatch_semaphore_wait)所處線程獲得了信號(hào)量拍皮,就繼續(xù)向下執(zhí)行并將信號(hào)量減1.等待期間沒有獲取到信號(hào)量或信號(hào)量值為0歹叮,等到timeout時(shí),所處線程自動(dòng)執(zhí)行下面語(yǔ)句
(4)dispatch_semaphore_signal的返回值為long類型铆帽,當(dāng)返回值為0時(shí)表示當(dāng)前沒有線程等待其處理的信號(hào)量
當(dāng)返回值不為0時(shí)盗胀,表示其當(dāng)前有(一個(gè)或多個(gè))線程等待其處理的信號(hào)量,并且該函數(shù)喚醒了一個(gè)等待的線程(當(dāng)線程有優(yōu)先級(jí)時(shí)锄贼,喚醒優(yōu)先級(jí)最高的線程票灰;否則隨機(jī)喚醒)。
dispatch_semaphore_wait返回值為long型宅荤。當(dāng)其返回0時(shí)表示在timeout之前屑迂,該函數(shù)所處線程被成功喚醒。
當(dāng)其返回不為0時(shí)冯键,表示timeout發(fā)生
(5)當(dāng)設(shè)置timeout時(shí)惹盼,比較有用的兩個(gè)宏:DISPATCH_TIME_NOW DISPATCH_TIME_FOREVER
第一個(gè)表示當(dāng)前,第二個(gè)表示遙遠(yuǎn)的未來(lái)
一般可以直接設(shè)置timeout為這兩個(gè)宏其中一個(gè)惫确,或者創(chuàng)建一個(gè)dispatch_time_t類型變量
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 110001000*1000);
表示當(dāng)前時(shí)間向后延時(shí)一秒為timeout的時(shí)間