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

iOS Swift5将使用带锁的NSMutableDictionary而不是var[:]来确保线程安全吗?,ios,thread-safety,nsmutabledictionary,swift5,Ios,Thread Safety,Nsmutabledictionary,Swift5,我正在调试在项目中继承的swift类。有人试图使用带有信号量的swift字典创建线程安全字典。代码在多线程环境中失败-swift字典被视为一个结构,并在变异时被复制,而不管信号量如何 我试图理解:将用一个核心基础NSMutableDictionary(用信号量)替换SWIFT结构字典,确保代码的线程安全性?< /强> ,但我的问题是关于修改swift代码 public class ThreadSafeDictionary<KeyType: Hashable, ValueType>

我正在调试在项目中继承的swift类。有人试图使用带有信号量的swift字典创建线程安全字典。代码在多线程环境中失败-swift字典被视为一个结构,并在变异时被复制,而不管信号量如何

我试图理解:<强>将用一个核心基础NSMutableDictionary(用信号量)替换SWIFT结构字典,确保代码的线程安全性?< /强>

,但我的问题是关于修改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
    }
}
公共类ThreadSafeDictionary{
私有变量字典:[KeyType:ValueType]=[:]
//改为:
private let dictionary=NSMutableDictionary()//这会使变异代码线程安全吗?
公共函数添加(键:键类型,值:值类型){
//信号量等待
//字典中的设置值
//信号量信号
}
}
或者-是否有一种方法可以使用swift关键字,如mutatinginout,以确保信号量可以防止多个线程使用swift字典的副本


更新:更高级别的代码中有一个bug,创建了两个独立的ThreadSafeDictionary实例。解决了并发性问题。

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


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

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


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

副本与您的问题有什么关系?该结构被包装在类中,只要将“dictionary”属性分配给它,所有这些都应该工作。也许你漏掉了一些关于你如何使用它的非常重要的信息。副本与你的问题有什么关系?该结构被包装在类中,只要将“dictionary”属性分配给它,所有这些都应该工作。可能您遗漏了一些关于如何使用此功能的非常重要的信息。谢谢-我发现了一个不同的错误,导致创建了两个ThreadSafeDictionary实例,使其看起来好像类的内部变量被调用代码复制了一样。谢谢-我发现了一个不同的错误,它导致创建了两个ThreadSafeDictionary实例,使其看起来好像类的内部变量被调用代码复制了一样。