У меня есть глобальная переменная, доступ к которой осуществляется из нескольких потоков, в том числе из основного потока. Я бы хотел использовать NSLock, потому что он быстрее, чем GCD.
Вот что я пытаюсь сделать:
struct SynchronizedLock<Value> {
private var _value: Value
private var lock = NSLock()
init(_ value: Value) {
self._value = value
}
var value: Value {
get { lock.synchronized { _value } }
set { lock.synchronized { _value = newValue } }
}
mutating func synchronized<T>(block: (inout Value) throws -> T) rethrows -> T {
return try lock.synchronized {
try block(&_value)
}
}
}
extension NSLocking {
func synchronized<T>(block: () throws -> T) rethrows -> T {
lock()
defer { unlock() }
return try block()
}
}
Будет ли NSLock
блокировать основной поток или его безопасно использовать в основном потоке? Также такая же ситуация с DispatchSemaphore
и следует ли прибегать к очередям?