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){ 可能会失败?
答案完全取决于问题的答案:
“你需要跑吗doIt“每次主线程设置 shouldDoIt 标志时,
如果该问题的答案是“是”,那么您的代码将无法工作,因为主线程可能会设置shouldDoIt为YES在您启动之后doIt但在重置标志之前。
如果答案是“否”,在这种狭窄的情况下,您所拥有的一切都还不错,除了在多 CPU 配置中,该标志可能以其他线程不会立即看到更改的方式进行缓存。所以你可能至少想使用OSAtomicTestAndClearBarrier()和 OSAtomicTestAndSetBarrier() ,它们是低级别的,因此尽可能快。
但是,我怀疑您是否需要这样做。doIt我认为您可能会发现以某种方式重构设计会得到更好的结果,具体取决于您在、do stuff和中尝试执行的操作do more stuff。
| 归档时间: |
|
| 查看次数: |
3586 次 |
| 最近记录: |