GCD 信號量 柵欄

信號量:就是一種可用來控制訪問資源的數(shù)量的標識,設(shè)定了一個信號量,在線程訪問之前,加上信號量的處理,則可告知系統(tǒng)按照我們指定的信號量數(shù)量來執(zhí)行多個線程。

類似場景;排隊時一次只能站五個人 ,剩余的等候進入隊列 ,當前排一個人出列 ,剩余的人即可以有一個人加入隊列。

信號量就是以這種方式排隊執(zhí)行

包含三個方法:

//創(chuàng)建信號量,參數(shù):信號量的初值,如果小于0則會返回NULL

dispatch_semaphore_create(信號量值)//相當于排隊時一次最大可容納數(shù) n

//等待降低信號量

dispatch_semaphore_wait(信號量,等待時間)占用信號量+1,剩余-1


//提高信號量

dispatch_semaphore_signal(信號量)釋放信號量

創(chuàng)建一個最大信號量為 2

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);???

????dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


????//任務1

????dispatch_async(quene, ^{

????????dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //此時信號量占用+1

????????NSLog(@"run task 1");

????????sleep(1);

????????NSLog(@"complete task 1");

????????dispatch_semaphore_signal(semaphore);????? 完成釋放資源 -1

????});<br>

????//任務2

????dispatch_async(quene, ^{

????????dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//此時信號量占用+1

????????NSLog(@"run task 2");

????????sleep(1);

????????NSLog(@"complete task 2");

????????dispatch_semaphore_signal(semaphore);??????? 完成釋放資源 -1

????});

//當前資源剩余0 所以再有任務就需要任務一或者任務二完成釋放資源方可。

????//任務3? 會等待任務一或者任務二完成時釋放資源才可執(zhí)行任務三

????dispatch_async(quene, ^{

????????dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

????????NSLog(@"run task 3");

????????sleep(1);

????????NSLog(@"complete task 3");

????????dispatch_semaphore_signal(semaphore);???????

????});???

執(zhí)行順序 run task 1

run task2

complete task 2

complete task 1

run task 3

complete task 3

設(shè)置信號量最大為1 ,可以實現(xiàn)各個隊列順序執(zhí)行,1-2-3

//柵欄

/*

? ? 1,開啟兩個線程處理A和B

? ? 2,通過任務組執(zhí)行A,B之后執(zhí)行C

? ? */

? ? dispatch_queue_t queue = dispatch_queue_create("dealWith", DISPATCH_QUEUE_CONCURRENT);

? ? dispatch_group_t group = dispatch_group_create();


? ? dispatch_group_async(group, queue, ^{

? ? ? ? NSLog(@"A----%@",[NSThread currentThread]);

? ? });


? ? dispatch_group_async(group, queue, ^{

? ? ? ? NSLog(@"B---%@",[NSThread currentThread]);

? ? });


? ? dispatch_group_notify(group, queue, ^{

? ? ? ? NSLog(@"C---%@",[NSThread currentThread]);

? ? });


需求: 有3個任務, 需要開啟多條線程去執(zhí)行。 有一個特殊任務0, 需要在1,2任務執(zhí)行完后, 再執(zhí)行3任務。

dispatch_queue_tqueue =dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);


dispatch_async(queue, ^{


NSLog(@"-------1----%@",[NSThreadcurrentThread]);

? ? });

dispatch_async(queue, ^{


NSLog(@"-------2----%@",[NSThreadcurrentThread]);

? ? });



//加入柵欄函數(shù),執(zhí)行任務0


dispatch_barrier_async(queue, ^{//不能使用全局隊列

NSLog(@"barrier");

? ? });


dispatch_async(queue, ^{


NSLog(@"-------3----%@",[NSThreadcurrentThread]);

? ? });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容