我正在调试一个我在项目中继承的 swift 类。曾尝试使用带有信号量的 swift 字典创建线程安全字典。代码在多线程环境中失败 - swift 字典被视为结构并在突变时复制,无论信号量如何。
我试图理解:用核心基础 NSMutableDictionary(带有信号量)替换基于 swift 结构的字典会确保代码的线程安全吗?
我看到了 Objective-C 的这个答案,但我的问题是关于修改 swift 代码。
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
}
}
或者 - 有没有办法使用像mutating或inout这样的 swift 关键字来确保信号量会阻止多个线程每个都使用 swift 字典的副本?
更新:更高级别的代码中有一个错误,创建了 2 个独立的 ThreadSafeDictionary 实例。修复该问题解决了并发问题。