线程安全:两个线程访问不同的 NSMutableDictionary 条目
Thread Safety: Two threads accessing distinct NSMutableDictionary entries
我有两个线程:线程 1 在 NSMutableDictionary 中设置一个键值对,稍后读取该值,线程 2 对另一个键值对执行相同的操作。
键是不同的,每个线程只读取它设置的键值对。但是,任何一个线程都可以在另一个线程写入的同时进行读取。
所以我的问题是,如果两个线程同时访问同一个 NSMutableDictionary 的不同条目,我是否需要保护 NSMutableDictionary? (整个 NSMutableDictionary "claimed" 是一个线程还是对各个条目的操作是独立的?)
您不能 change/mutate 像字典这样的容器对象同时从另一个线程读取或写入它。
在字典上设置 key/value 对会改变字典。每 key/value 对不是一个独立的实体。
您必须保护字典,否则您可能会崩溃或出现其他不良行为。从 Objective-C 做到这一点的一种简单方法是使用 @synchronized
指令,并使用字典本身作为传递给指令的对象:
@synchronized(myDict) {
valueFromDict = myDict[@"someKey"];
}
来自另一个线程:
@synchronized(myDict) {
myDict[@"someOtherKey"] = someValue;
}
我有两个线程:线程 1 在 NSMutableDictionary 中设置一个键值对,稍后读取该值,线程 2 对另一个键值对执行相同的操作。 键是不同的,每个线程只读取它设置的键值对。但是,任何一个线程都可以在另一个线程写入的同时进行读取。
所以我的问题是,如果两个线程同时访问同一个 NSMutableDictionary 的不同条目,我是否需要保护 NSMutableDictionary? (整个 NSMutableDictionary "claimed" 是一个线程还是对各个条目的操作是独立的?)
您不能 change/mutate 像字典这样的容器对象同时从另一个线程读取或写入它。
在字典上设置 key/value 对会改变字典。每 key/value 对不是一个独立的实体。
您必须保护字典,否则您可能会崩溃或出现其他不良行为。从 Objective-C 做到这一点的一种简单方法是使用 @synchronized
指令,并使用字典本身作为传递给指令的对象:
@synchronized(myDict) {
valueFromDict = myDict[@"someKey"];
}
来自另一个线程:
@synchronized(myDict) {
myDict[@"someOtherKey"] = someValue;
}