以下、実装です。
なお、Swiftはハイレベルなものからローレベルなものまで様々なマルチスレッド・プログラミングのためのAPIがあり、これが筋の良いものかはまだ未検証。
容易に想像がつくが、flags: .barrier
がないとクラッシュする(検証済み)
class ThreadSafeHash<T: Hashable, S> {
private var raw: [T: S]
private let concurrentQueue = DispatchQueue(label: "ThreadSafeHashQueue", attributes: .concurrent)
init(_ raw: [T: S]) {
self.raw = raw
}
subscript(i: T) -> S? {
get {
var value: S?
concurrentQueue.sync {
value = raw[i]
}
return value
}
set {
concurrentQueue.async(flags: .barrier) {
self.raw[i] = newValue
}
}
}
}
DispatchSemaphore, NSCache, objc_sync_enter, NSLock等との比較
- TODO
苦情・まさかりはコチラ
twitter: _kentrino