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

时间:2010-12-16 15:31:45

标签: objective-c multithreading cocoa atomic

我对多线程编程很陌生并且想知道它是否正常或是否像

这样建立属性
@property BOOL shouldDoIt; //atomic

将在后台调用的循环中使用

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

并在主线程调用的方法中进行了更改

- (void) methodCalledFromMainThread{
    self.shouldDoIt = YES;
}

是否使其成为原子或不会改变任何内容? 我知道原子与非原子相比速度慢,我的程序需要更快的速度,但如果不使用原子,那么执行if (shouldDoIt){可能会失败吗?

4 个答案:

答案 0 :(得分:2)

On可以线程化你在后台线程中做一些工作后想要设置为BOOL

[NSThread detachNewThreadSelector:@selector(backThreadAction:) toTarget:self withObject:nil];


-(void) backThreadAction:(id*)someObject{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //do stuff here

    [self performSelectorOnMainThread:@selector(didFinishBackThreadAction:) withObject:nil waitUntilDone:NO];
    [pool release];
}

-(void) didFinishBackThreadAction:(id *)someObject{
   //set your bool to no
}

答案 1 :(得分:2)

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

“每次主线程设置shouldDoIt标志时,你是否需要运行doIt一次?”

如果该问题的答案为“是”,那么您的代码将无效,因为主线程可能会在您启动shouldDoIt之后但在重置之前将YES设置为doIt国旗。

如果答案是“否”,在这种狭隘的情况下,除了在多CPU配置中,标志可能以另一个线程不会立即看到的方式缓存的情况之外,你所拥有的是好的。改变。所以你可能至少想要使用低级别的OSAtomicTestAndClearBarrier()和OSAtomicTestAndSetBarrier(),因此速度最快。

然而,我怀疑你需要这样做。我认为您可能会发现以某种方式重构设计会获得更好的结果,具体取决于您在doItdo stuffdo more stuff中尝试执行的操作。

答案 2 :(得分:0)

首先阅读Apple的Threading Programming Guide,我认为您需要NSLock 但要小心你可以陷入僵局。 祝你好运

答案 3 :(得分:0)

在这部分代码中:

if (self.shouldDoIt) {
    [self doIt];

当你打电话给它时,原子并不能保证它仍然是true。您必须使用锁定以确保在测试之后以及在您实际执行必须执行的操作之前未更改该值。