1. 程式人生 > 實用技巧 >訊號量的鎖如果多釋放訊號會怎麼樣

訊號量的鎖如果多釋放訊號會怎麼樣

dispatch_semaphore_t lock = dispatch_semaphore_create(1);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任務1");
        dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
        NSLog(@"任務1 over");
        dispatch_semaphore_signal(lock);
        NSLog(@"任務1 ----->1");
        dispatch_semaphore_signal(
lock); NSLog(@"任務1 ----->2"); dispatch_semaphore_signal(lock); NSLog(@"任務1 ----->3"); }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"任務2"); dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); NSLog(@"任務2 over"); }); dispatch_async(dispatch_get_global_queue(
0, 0), ^{ NSLog(@"任務3"); dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); NSLog(@"任務3 over"); }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"任務4"); dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); NSLog(@"任務4 over"); });
2020-09-10 19:18:26.347357+0800 FindClassMethods[6856:271676] 任務1
2020-09-10 19:18:26.347364+0800 FindClassMethods[6856:271671] 任務2
2020-09-10 19:18:26.347387+0800 FindClassMethods[6856:271675] 任務3
2020-09-10 19:18:26.347400+0800 FindClassMethods[6856:271672] 任務4
2020-09-10 19:18:26.347539+0800 FindClassMethods[6856:271676] 任務1 over
2020-09-10 19:18:26.347656+0800 FindClassMethods[6856:271676] 任務1 ----->1
2020-09-10 19:18:26.347667+0800 FindClassMethods[6856:271671] 任務2 over
2020-09-10 19:18:26.347743+0800 FindClassMethods[6856:271676] 任務1 ----->2
2020-09-10 19:18:26.347755+0800 FindClassMethods[6856:271675] 任務3 over
2020-09-10 19:18:26.347995+0800 FindClassMethods[6856:271676] 任務1 ----->3
2020-09-10 19:18:26.348008+0800 FindClassMethods[6856:271672] 任務4 over

如上所示,如果運氣好第一個先執行,那麼就會出現1得到鎖,2,3,4必須等待,1執行任務,1放開一個鎖,另一個執行緒2立即得到鎖,2執行任務,1繼續放開一個鎖,然後被3得到了... (所以喚起另一個執行緒之後會立即執行這個執行緒?)

如果說,一開始先執行了多次釋放訊號量,後面加鎖但是沒有釋放訊號量也可以有多個執行緒得到鎖往下執行,說明每釋放一次就會+1訊號量,多釋放可能會出現自己不希望的結果,所以對訊號量值的掌握要相當有把握才行