【发布时间】:2021-01-10 22:54:50
【问题描述】:
我正在对互斥锁进行一些研究,并遇到了以下 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) }
...
}
}
代码在闭包中定义并初始化一个 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
}()
我觉得后者肯定是不正确的,因为当闭包崩溃时,其地址被传递到互斥锁中的属性存储将消失。
【问题讨论】:
标签: swift concurrency pthreads