gpt4 book ai didi

java - java在 objective-c 中的并发hashmap的等价物

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:17:18 27 4
gpt4 key购买 nike

我有一个由并行线程访问的 NSMuableDictionary,其中很少有线程会枚举,也很少有线程会发生变异。但是我们无法实现这一点,因为

"Collections cannot be mutated during enumeration"

。考虑使用NSLock,但是在枚举完成之前锁定字典会导致性能下降。在java中我们有足够聪明的并发hashmap来处理这种情况。有没有在 iOS 中实现这个更好的想法?请帮助。

最佳答案

对 Objective-C 容器的读/写访问通常不是线程安全的。

您可以通过将容器与专用调度队列相关联,然后在该队列上执行所有读写访问来解决并发问题。队列可以是串行的,也可以是并发的。

您可以在任何专用线程上调用以下方法。但是,我建议最终将您的实现切换为分派(dispatch)库。

在这里,我们创建一个串行队列:

dispatch_queue_t sync_queue = dispatch_queue_create("sync_queue", NULL);

写访问可以异步进行:

- (void) addItem:(id)item forKey:(NSString*)key {
dispatch_async(sync_queue, ^{
[self.dict setObject:item forKey:key];
});
}

返回值的读取访问必须是同步的:

- (id) itemForKey:(NSString*)key {
__block id item;
dispatch_sync(sync_queue, ^{
item = [self.dict objectForKey:key];
});
return item;
}

您可以为任何任务定义类似的包装器:

- (void) iterate {
dispatch_async(sync_queue, ^{
for (id item in self.dict) {
...
}
});
}

使用并发队列:

dispatch_queue_t sync_queue = dispatch_queue_create("sync_queue", DISPATCH_QUEUE_CONCURRENT);

写访问可以异步进行并且需要一个屏障:

- (void) addItem:(id)item forKey:(NSString*)key {
dispatch_barrier_async(sync_queue, ^{
[self.dict setObject:item forKey:key];
});
}

返回值的读取访问必须是同步的,并且不需要屏障。基本上,同步和并发队列没有区别:

- (id) itemForKey:(NSString*)key {
__block id item;
dispatch_sync(sync_queue, ^{
item = [self.dict objectForKey:key];
});
return item;
}

关于java - java在 objective-c 中的并发hashmap的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com