信號量:就是一種可用來控制訪問資源的數(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]);
? ? });