1. 程式人生 > >ios開發GCD(2)-dispatch_semaphore_t信號量計數器

ios開發GCD(2)-dispatch_semaphore_t信號量計數器

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信號量計數器