【发布时间】:2019-06-17 22:19:57
【问题描述】:
我正在调试我在项目中继承的 swift 类。曾尝试使用带有信号量的 swift 字典创建线程安全字典。代码在多线程环境中失败 - swift 字典被视为结构并在突变时复制,无论信号量如何。
我试图理解:用核心基础 NSMutableDictionary(带有信号量)替换基于 swift 结构的字典是否会确保代码的线程安全?
I see this answer for 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 实例。修复解决了并发问题。
【问题讨论】:
-
副本与您的问题有什么关系?该结构包含在您的类中,只要将“字典”属性分配给它,它就应该可以工作。也许你遗漏了一些关于如何使用它的非常重要的信息。
标签: ios thread-safety nsmutabledictionary swift5