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
開始と終了が順番になっている事を確認。