首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS Swift5将使用带锁的NSMutableDictionary而不是var [:]来确保线程安全?

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

Stack Overflow用户
提问于 2019-06-17 12:12:27
回答 1查看 252关注 0票数 0

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

我试图理解:将用核心基础NSMutableDictionary (用信号量)替换基于结构的快速字典,以确保代码?的线程安全。

I see this answer for Objective-C,但我的问题是修改快速代码。

代码语言:javascript
运行
复制
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实例。修复它解决了并发问题.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-17 12:43:20

如果将Swift目录(例如struct )包装到Swift类(引用类型)中,则会以某种方式丢失结构的复制写入机制(这确实是为了防止多线程问题)。因此,如果将内部directory成员从Swift类型更改为基金会的NSMutableDirectory,则不会获得任何信息。而且,mutatinginout并不意味着任何线程安全。

为了使ThreadSafeDictionary线程安全,您需要包装内部目录的所有访问方法,就像您在func add...()函数中描述的那样。您也可以在自己的串行队列中使用GCD,而不是使用信号量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56631062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档