【Swift】NSLockで排他制御する方法!マルチスレッド参照
この記事からわかること
- Swiftで排他制御を行う方法
- NSLockの使い方
- マルチスレッドでデータを操作する際の注意点
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
排他制御とは?
排他制御とは複数のプロセスやスレッドが同時に共有リソースにアクセスする際に競合状態を防止するための仕組みです。Swiftのようなマルチスレッドでデータを操作できる言語の場合、共有のデータを異なるスレッドから別のタイミングで更新しようとするとデータに不整合が生じ、アプリのクラッシュを引き起こす原因になってしまいます。
これを防ぐためには排他制御が行える仕組みを活用して適切にデータの整合性を保つ必要があります。
NSLock
Swiftで排他制御を簡単に行うことができるのがNSLock
です。このクラスは複数の実行スレッドの操作を調整することが可能です。
使用方法は簡単で例えばマルチスレッドから参照されるデータ配列に対して排他制御を設けたい場合は以下のように実装します。
class CustomDataList {
private var lock = NSLock()
public var list = [""]
public func add(str: String) {
lock.lock()
list.append(str)
lock.unlock()
}
public func remove() {
lock.lock()
list.removeFirst()
lock.unlock()
}
}
lock
メソッドで排他制御をかけることができ、unlock
メソッドで解除します。これによりlock中は他のスレッドからの参照をunlockされるまで待機させることができ、安全にデータを操作することが可能になります。
注意点
使用する際の注意点としてlock
メソッドを2回連続で呼び出したり、lock
してないのにunlockメソッドを実行するとエラーになるので注意してください。
lock.lock()
lock.lock()
// lock.lock()
lock.unlock()
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。