訊號量的鎖如果多釋放訊號會怎麼樣
阿新 • • 發佈:2020-09-10
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訊號量,多釋放可能會出現自己不希望的結果,所以對訊號量值的掌握要相當有把握才行