2017-04-18 9 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'には1つの欠陥があります。これはiOS10.0から利用可能です。 – kelin

答えて

1

はい、彼らは生産者 - 消費者の問題に対処するために、両方とも同じ機能を持っています。

セマフォは、それに応じて複数のスレッドが共有リソースにアクセスできるようにします。同じ並行ディスパッチQueue内のブロックの実行を行うことができます。

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

実際には、同時に1つのスレッドに同時にアクセスするスレッドが1つだけであれば、同じことがロックに適用されます。

私はこれが役立つことが判明:彼らは、彼らが「ロック」じゃない場合でもhttps://priteshrnandgaonkar.github.io/concurrency-with-swift-3/