在主线程上使用 NSLock 安全吗?
Safe to use NSLock on main thread?
我有一个从多个线程访问的全局变量,包括从主线程访问。我想使用 NSLock .
这是我正在尝试做的事情:
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
也是这种情况,应该求助于队列吗?
是的,从任何线程使用 NSLock
都是安全的,包括主线程。 NSLock
的唯一限制是您必须从锁定它的同一个线程解锁它,您在此处执行此操作。
Would NSLock
block the main thread or is it safe to use on the main thread?
显然,如果您长时间阻塞主线程,就会出现问题。因此,请确保您始终快速进出。始终避免长时间锁定(或阻塞)。
Also is this the same situation with DispatchSemaphore
and should resort to queues?
任何同步机制都可以阻塞正在使用它们的线程,因此无论同步机制如何,它都会产生很大的问题。 DispatchSemaphore
或 GCD 串行队列都会遇到与此锁定模式相同的问题。
您始终可以使用 reader-writer 模式,它可以稍微缓解这种情况(它允许并发读取并且只阻止写入)。
但作为一般规则,限制您在同步机制中执行的操作。例如。如果您正在做一些昂贵的事情,请在本地对特定线程做尽可能多的事情,并且只同步共享资源的最终更新。
我有一个从多个线程访问的全局变量,包括从主线程访问。我想使用 NSLock
这是我正在尝试做的事情:
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
也是这种情况,应该求助于队列吗?
是的,从任何线程使用 NSLock
都是安全的,包括主线程。 NSLock
的唯一限制是您必须从锁定它的同一个线程解锁它,您在此处执行此操作。
Would
NSLock
block the main thread or is it safe to use on the main thread?
显然,如果您长时间阻塞主线程,就会出现问题。因此,请确保您始终快速进出。始终避免长时间锁定(或阻塞)。
Also is this the same situation with
DispatchSemaphore
and should resort to queues?
任何同步机制都可以阻塞正在使用它们的线程,因此无论同步机制如何,它都会产生很大的问题。 DispatchSemaphore
或 GCD 串行队列都会遇到与此锁定模式相同的问题。
您始终可以使用 reader-writer 模式,它可以稍微缓解这种情况(它允许并发读取并且只阻止写入)。
但作为一般规则,限制您在同步机制中执行的操作。例如。如果您正在做一些昂贵的事情,请在本地对特定线程做尽可能多的事情,并且只同步共享资源的最终更新。