gpt4 book ai didi

Objective-C __block 关键字和线程安全

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:20 28 4
gpt4 key购买 nike

我想知道如何在方法的上下文中访问 __block 限定的 var 线程安全。

例子:

__block NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

for (int i=0; i<20; i++) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[dictionary setObject:@"test" forKey:@"test"];
}];
[someConcurrentQueue addOperation:operation];
}

此处操作被添加到并发队列中,dictionary var 可能是同时从不同的线程访问。

这样安全吗?如果不是,我如何才能安全地访问 dictionary

最佳答案

正如 UIAdam 在他的评论中所说,__block 在这里没有为您做任何事情;你正在改变字典,而不是分配给变量。该变量将永远指向同一个字典。

事实上,__block 在这里可能会伤害到你,因为它意味着变量不会被 block 捕获。如果你不使用 ARC,这意味着字典将不会被保留,并且该 block 可能很快就会向死对象发送消息。我不确定 ARC 是否改变了这一点。无论如何,你应该离开这个变量的 __block;如果没有别的,代码可以更清楚地表达您的意图。

至于你的实际问题,关于线程安全,这段代码是不安全的。 According to the Thread-Safety Summary ,可变集合类不是线程安全的:您必须一次从不超过一个线程向可变集合发送消息。同步是一种方式; setting the queue's max concurrent operation count到 1 将是另一个。

关于Objective-C __block 关键字和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451442/

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