我正在调试在项目中继承的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实例。该修复程序解决了并发问题。
答案 0 :(得分:2)
如果将Swift目录(例如struct)包装到Swift类(引用类型)中,则将以某种方式丢失该结构的写时复制机制(这实际上是为了防止多线程问题) 。因此,如果将内部directory
成员从Swift类型更改为Foundation的NSMutableDirectory
,您将一无所获。另外,mutating
或inout
并不意味着任何线程安全。
要使ThreadSafeDictionary
线程安全,您需要包装内部目录的所有访问方法,如func add...()
函数中所述。除了使用信号量之外,您还可以将GCD与自己的串行队列一起使用。