ios開發GCD(2)-dispatch_semaphore_t信號量計數器
阿新 • • 發佈:2018-10-16
ios開發 計數器 name 代碼執行 sop create 開始 ber 釋放
思考:現在有多個線程異步執行,我們想要同時最多只能執行2個或n個,該怎麽辦?
dispatch_semaphore_t
看代碼解析:
NSLog(@"開始"); dispatch_semaphore_t t = dispatch_semaphore_create(2);//設置信號量初始值 dispatch_async(dispatch_queue_create("one", DISPATCH_QUEUE_CONCURRENT), ^{ dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信號量>0時,才執行後面的代碼,信號量-1;否則,處於等待狀態。//要執行的操作 NSLog(@"任務1=%@",[NSThread currentThread]); sleep(5); dispatch_semaphore_signal(t);//任務完成,信號量+1 }); dispatch_async(dispatch_queue_create("two", DISPATCH_QUEUE_CONCURRENT), ^{ dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信號量>0時,才執行後面的代碼,信號量-1;否則,處於等待狀態。//要執行的操作 NSLog(@"任務2=%@",[NSThread currentThread]); sleep(5); dispatch_semaphore_signal(t);//任務完成,信號量+1 }); dispatch_async(dispatch_queue_create("three", DISPATCH_QUEUE_CONCURRENT), ^{ dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信號量>0時,才執行後面的代碼,信號量-1;否則,處於等待狀態。//要執行的操作 NSLog(@"任務3=%@",[NSThread currentThread]); dispatch_semaphore_signal(t);//任務完成,信號量+1 }); dispatch_async(dispatch_queue_create("four", DISPATCH_QUEUE_CONCURRENT), ^{ dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信號量>0時,才執行後面的代碼,信號量-1;否則,處於等待狀態。 //要執行的操作 NSLog(@"任務4=%@",[NSThread currentThread]); dispatch_semaphore_signal(t);//任務完成,信號量+1 });
看打印結果:
2018-10-16 14:05:48.148321+0800 NSThread-GCD-NSOperation[5280:2575154] 開始 2018-10-16 14:05:48.150346+0800 NSThread-GCD-NSOperation[5280:2575369] 任務1=<NSThread: 0x1c0279a40>{number = 3, name = (null)} 2018-10-16 14:05:48.150867+0800 NSThread-GCD-NSOperation[5280:2575278] 任務2=<NSThread: 0x1c447ee00>{number = 4, name = (null)} 2018-10-16 14:05:53.152640+0800 NSThread-GCD-NSOperation[5280:2575371] 任務3=<NSThread: 0x1c046bd00>{number = 5, name = (null)} 2018-10-16 14:05:53.152729+0800 NSThread-GCD-NSOperation[5280:2575372] 任務4=<NSThread: 0x1c4476440>{number = 6, name = (null)}
解析:
這裏有4個線程異步執行,正常情況下,是同時執行的,不分先後;
這裏將信號量設為2,說明同時只能執行2個任務。
代碼執行到任務1,信號量-1,這時信號量=1;因為我們設置的同時可以執行2個任務,所以任務2此時也可以執行,代碼執行到任務2時,信號量繼續-1,此時信號量=0;因為前兩個任務都是耗時操作,任務不完成,導致信號量不釋放出來(+1),所以後面的異步線程不會執行;只有當前面的有任務完成,信號量+1,這時監測到信號量>0,才會執行後面的任務。
由打印結果可以看到,任務3和4打印時間比任務1和2遲了5秒。
ios開發GCD(2)-dispatch_semaphore_t信號量計數器