gpt4 book ai didi

ios - 当在另一个线程上执行 block 时,我应该将 'volatile' 与 '__block' 限定符一起使用吗?

转载 作者:行者123 更新时间:2023-11-29 02:33:46 25 4
gpt4 key购买 nike

让我们看一下这段代码:

- (void)addOperationAndWait:(void (^)())operation {
__block NSException *exception = nil;
[self.queue addOperationWithBlock:^{
@try {
operation();
}
@catch (NSException *ex) {
exception = ex;
}
}];
[self.queue waitUntilAllOperationsAreFinished];
if (exception) {
@throw exception;
}
}

这些代码行在一个线程上执行:

 __block NSException *exception = nil;

if (exception) {
@throw exception;
}

这行代码在另一个线程上执行:

exception = ex;

那么我应该将异常变量声明为 volatile 以确保该变量的值不会被使用它的线程缓存吗?

由于这篇文档,我有疑问:

volatile 变量对各个变量应用另一种类型的内存约束。编译器通常通过将变量的值加载到寄存器中来优化代码。对于局部变量,这通常不是问题。然而,如果该变量对另一个线程可见,则这种优化可能会阻止其他线程注意到它的任何更改。将 volatile 关键字应用于变量会强制编译器在每次使用该变量时从内存加载该变量。如果一个变量的值可以随时被编译器可能无法检测到的外部源更改,则可以将其声明为 volatile 变量

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

最佳答案

volatile 对多线程访问变量根本没有帮助。使用原子操作,或使用原子属性。

关于ios - 当在另一个线程上执行 block 时,我应该将 'volatile' 与 '__block' 限定符一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26603277/

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