小编Mic*_*ong的帖子

在 Swift 中移动互斥锁安全吗?

我正在对互斥锁进行一些研究,并发现了以下 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)

后者让我觉得绝对是不正确的,因为当闭包崩溃时,其地址传递到互斥体的属性存储将消失。

concurrency pthreads swift

1
推荐指数
1
解决办法
787
查看次数

标签 统计

concurrency ×1

pthreads ×1

swift ×1