iOS Swift5将使用带锁的NSMutableDictionary而不是var [:]来确保线程安全吗?

时间:2019-06-17 12:12:27

标签: ios thread-safety nsmutabledictionary swift5

我正在调试在项目中继承的swift类。尝试使用带有信号灯的快速字典创建线程安全字典。该代码在多线程环境中失败-快速字典被视为结构,并且在突变时被复制,而与信号量无关。

我试图理解:是否会使用核心基础NSMutableDictionary(带有信号量)替换基于Swift struct的字典来确保代码的线程安全性?

I see this answer for Objective-C,但是我的问题是关于修改快速代码。

public class ThreadSafeDictionary<KeyType: Hashable, ValueType> {

    private var dictionary: [KeyType: ValueType] = [:]
    //change to:
    private let dictionary = NSMutableDictionary() //will this make the mutating code thread safe?

    public func add(key: KeyType, value: ValueType) {
    // semaphore wait
    // set value in dictionary
    // semaphore signal
    }
}

或者-有一种方法可以使用诸如 muting inout 之类的swift关键字来确保信号量可以防止多个线程各自使用swift的副本字典?

已更新:更高级别的代码中存在一个错误,创建了2个独立的ThreadSafeDictionary实例。该修复程序解决了并发问题。

1 个答案:

答案 0 :(得分:2)

如果将Swift目录(例如struct)包装到Swift类(引用类型)中,则将以某种方式丢失该结构的写时复制机制(这实际上是为了防止多线程问题) 。因此,如果将内部directory成员从Swift类型更改为Foundation的NSMutableDirectory,您将一无所获。另外,mutatinginout并不意味着任何线程安全。

要使ThreadSafeDictionary线程安全,您需要包装内部目录的所有访问方法,如func add...()函数中所述。除了使用信号量之外,您还可以将GCD与自己的串行队列一起使用。