2017-04-18 92 views
4

我一直在使用NSLock來同步代碼的敏感部分,但由於它們必須從它們被鎖定的同一線程中解鎖,所以一直存在問題。然後我發現GCD的DispatchSemaphore似乎做同樣的事情,增加了方便,他們可以從任何線程發出信號。不過,我想知道,如果這種便利是以線程安全的價格出現的話。它是建議與DispatchSemaphore是NSLock的一個很好的替代品嗎?

let semaphore = DispatchSemaphore(value: 1) 
semaphore.wait() 
// do things... 
semaphore.signal() 

更換

let lock = NSLock() 
lock.lock() 
// do things... 
lock.unlock() 

或者我會碰上關於線程安全問題呢?

+0

仍然沒有得到答案,但另一個原因是我更願意用信號燈的是,它是安全的「解鎖」他們,即使他們沒有被「鎖定」 。 –

+1

'DispatchSemaphore'有一個缺陷 - 從iOS10.0開始可用。 – kelin

回答

1

是的,他們具有相同的功能,既可以對付生產者 - 消費者問題。

旗語允許如果它被相應地配置一個以上的線程訪問共享資源。您可以在同一個併發dispatchQueue中執行塊。

{semaphore.wait() 
// do things... 
semaphore.signal()} 

其實同樣適用於Lock,如果你只想讓一個線程同時觸及資源,併發的方式。

我發現這是有幫助的:https://priteshrnandgaonkar.github.io/concurrency-with-swift-3/