iOS
Swift
swift4

Swift 4 排他処理

Swift4で排他制御が必要だった為、実装を行った。

方法

let lockObj = NSObject()

objc_sync_enter(lockObj) // ロック開始

... 排他処理

objc_sync_exit(lockObj)  // ロック終了

検証用コード

UnitTest
func testSynchronized() {
    let ex = expectation(description: "test")
    let lockObj = NSObject()
    var count = 0
    func work(_ i: Int) {
        objc_sync_enter(lockObj)
        print("[START] \(i)")
        usleep(arc4random() % 1000)
        print("[END  ] \(i)")
        objc_sync_exit(lockObj)
    }
    DispatchQueue.global().async {
        for i in 1...5 {
            work(i)
        }
        count += 1
    }
    DispatchQueue.global().async {
        for i in 6...10 {
            work(i)
        }
        count += 1
    }
    DispatchQueue.global().async {
        while count != 2 { }
        ex.fulfill()
    }
    waitForExpectations(timeout: 60, handler: nil)
}

実行結果

排他制御なし

[START] 1
[START] 6
[END  ] 1
[START] 2
[END  ] 6
[START] 7
[END  ] 2
[START] 3
[END  ] 7
[START] 8
[END  ] 3
[START] 4
[END  ] 8
[START] 9
[END  ] 4
[START] 5
[END  ] 9
[START] 10
[END  ] 5
[END  ] 10

排他制御あり

[START] 6
[END  ] 6
[START] 1
[END  ] 1
[START] 7
[END  ] 7
[START] 2
[END  ] 2
[START] 8
[END  ] 8
[START] 3
[END  ] 3
[START] 9
[END  ] 9
[START] 4
[END  ] 4
[START] 10
[END  ] 10
[START] 5
[END  ] 5

開始と終了が順番になっている事を確認。