我正在对互斥锁进行一些研究,并发现了以下 Swift 代码:
class Lock {
private var mutex: pthread_mutex_t = {
var mutex = pthread_mutex_t()
pthread_mutex_init(&mutex, nil)
return mutex
}()
func someFunc() {
pthread_mutex_lock(&mutex)
defer { pthread_mutex_unlock(&mutex) }
...
}
}
Run Code Online (Sandbox Code Playgroud)
该代码在闭包内定义并初始化 pthread_mutex_t,然后将返回值分配给类属性。然后,它会在多个功能内进行锁定和解锁,如图所示。
由于还应该调用 pthread_mutex_destroy,这意味着互斥体中正在发生某种分配,该互斥体可能会或可能不会引用原始值的地址。
实际上,互斥量在一个位置初始化并存储在另一个位置。
问题是这样做是否安全或正确?
如果互斥体初始值设定项需要参数怎么办?
private var mutex: pthread_mutex_t = {
var recursiveMutex = pthread_mutex_t()
var recursiveMutexAttr = pthread_mutexattr_t()
pthread_mutexattr_init(&recursiveMutexAttr)
pthread_mutexattr_settype(&recursiveMutexAttr, PTHREAD_MUTEX_RECURSIVE)
pthread_mutex_init(&recursiveMutex, &recursiveMutexAttr)
return recursiveMutex
}()
Run Code Online (Sandbox Code Playgroud)
后者让我觉得绝对是不正确的,因为当闭包崩溃时,其地址传递到互斥体的属性存储将消失。