【Swift】NSLockで排他制御する方法!マルチスレッド参照

この記事からわかること

  • Swift排他制御行う方法
  • NSLock使い方
  • マルチスレッドデータ操作する際の注意点

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

排他制御とは?

排他制御とは複数のプロセスやスレッドが同時に共有リソースにアクセスする際に競合状態を防止するための仕組みです。Swiftのようなマルチスレッドでデータを操作できる言語の場合、共有のデータを異なるスレッドから別のタイミングで更新しようとするとデータに不整合が生じ、アプリのクラッシュを引き起こす原因になってしまいます。

これを防ぐためには排他制御が行える仕組みを活用して適切にデータの整合性を保つ必要があります。

NSLock

公式リファレンス: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()

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index