在多线程编程中使原子成为BOOL标志是否有意义

nac*_*o4d 5 cocoa multithreading atomic objective-c

我对多线程编程很陌生,并想知道它是否正常或者是否有类似的属性

@property BOOL shouldDoIt; //atomic
Run Code Online (Sandbox Code Playgroud)

它将用于在后台调用的循环中

- (void) loop{
    // ... do stuff ...
    if (self.shouldDoIt) {
        [self doIt];
        self.shouldDoIt = NO;
    }
    // ... do more stuff ...
}
Run Code Online (Sandbox Code Playgroud)

并在从主线程调用的方法中更改

- (void) methodCalledFromMainThread{
    self.shouldDoIt = YES;
}
Run Code Online (Sandbox Code Playgroud)

必须使其原子化或不改变任何东西吗?我知道原子与非原子相比速度慢,我的程序需要更快的速度,但如果不使用原子那么做if (shouldDoIt){ 可能会失败?

Jer*_*myP 2

答案完全取决于问题的答案:

“你需要跑吗doIt“每次主线程设置 shouldDoIt 标志时,

如果该问题的答案是“是”,那么您的代码将无法工作,因为主线程可能会设置shouldDoItYES在您启动之后doIt但在重置标志之前。

如果答案是“否”,在这种狭窄的情况下,您所拥有的一切都还不错,除了在多 CPU 配置中,该标志可能以其他线程不会立即看到更改的方式进行缓存。所以你可能至少想使用OSAtomicTestAndClearBarrier()和 OSAtomicTestAndSetBarrier() ,它们是低级别的,因此尽可能快。

但是,我怀疑您是否需要这样做。doIt我认为您可能会发现以某种方式重构设计会得到更好的结果,具体取决于您在、do stuff和中尝试执行的操作do more stuff