我正在调试一个已在项目中继承的快速类。有人试图使用带有信号量的快速字典创建线程安全字典。代码在多线程环境中失败--无论信号量如何,快速字典都被视为一个结构,并在变异时被复制。
我试图理解:将用核心基础NSMutableDictionary (用信号量)替换基于结构的快速字典,以确保代码?的线程安全。
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
}
}
或者-是否有一种方法可以使用快速关键字,如、变异或inout,以确保信号量可以防止每个线程处理一个快速字典的副本?
更新:在更高级别的代码中有一个错误,创建了两个独立的ThreadSafeDictionary实例。修复它解决了并发问题.
发布于 2019-06-17 12:43:20
如果将Swift目录(例如struct )包装到Swift类(引用类型)中,则会以某种方式丢失结构的复制写入机制(这确实是为了防止多线程问题)。因此,如果将内部directory
成员从Swift类型更改为基金会的NSMutableDirectory
,则不会获得任何信息。而且,mutating
或inout
并不意味着任何线程安全。
为了使ThreadSafeDictionary
线程安全,您需要包装内部目录的所有访问方法,就像您在func add...()
函数中描述的那样。您也可以在自己的串行队列中使用GCD,而不是使用信号量。
https://stackoverflow.com/questions/56631062
复制相似问题