Objective c 在多线程编程中,将原子设为BOOL标志有意义吗

Objective c 在多线程编程中,将原子设为BOOL标志有意义吗,objective-c,multithreading,cocoa,atomic,Objective C,Multithreading,Cocoa,Atomic,我对多线程编程非常陌生,不知道它是否可以,或者是否可以创建一个类似的属性 @property BOOL shouldDoIt; //atomic 它将在后台调用的循环中使用 - (void) loop{ // ... do stuff ... if (self.shouldDoIt) { [self doIt]; self.shouldDoIt = NO; } // ... do more stuff ... } 并在从主线程调

我对多线程编程非常陌生,不知道它是否可以,或者是否可以创建一个类似的属性

@property BOOL shouldDoIt; //atomic
它将在后台调用的循环中使用

- (void) loop{
    // ... do stuff ...
    if (self.shouldDoIt) {
        [self doIt];
        self.shouldDoIt = NO;
    }
    // ... do more stuff ...
}
并在从主线程调用的方法中更改

- (void) methodCalledFromMainThread{
    self.shouldDoIt = YES;
}
我是否有将其原子化,或者它不会改变任何东西? 我知道原子的速度比非原子的慢,我的程序需要更高的速度,但如果不使用原子的话,那么如果(应该做){可能会失败?

首先阅读苹果的文章,我想你需要一个 但是要小心,你可能会陷入僵局。
祝您好运

在五月线程上,您有一个BOOL,在您在后线程中执行某些操作后,您希望将其设置为no

[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
}

在守则的这部分:

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

shouldDoIt是原子的并不保证在调用doIt时它仍然是
true
。必须使用锁来确保在测试之后和实际执行您必须执行的操作之前,值没有更改。

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

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

如果该问题的答案为“是”,则代码将不起作用,因为在启动
doIt
之后,但在重置标志之前,主线程可能会将
shouldDoIt
设置为
yes

如果答案是“否”,那么在这种狭义的情况下,您所拥有的就可以了,但在多CPU配置中,标记可能会以这样的方式被缓存,以至于其他线程不会立即看到更改。因此,您可能至少希望使用和OSAtomicTestAndSetBarrier()这些都是低水平的,因此尽可能快,你可以得到


然而,我怀疑你是否需要这样做。我想你可能会发现,根据你在
doIt
dot
doe more stuff
我知道NSLock是一种替代方法,但我认为这是一项太多的工作,我正试图找到你如果像这种情况下只有一个BOOL标志,那么“atomic”就足够了。如果你设置一个属性atomic,它将在setter和getter上有互斥锁。在你的情况下,如果你将BOOL设置为yes,然后转到一个后台线程做一些事情,在你做了这些事情之后,你将把它设置为no,我在这里看不出任何问题。如果我们只使用wr,这不是真的iter线程和reader线程!如果我们只使用writer线程和reader线程,那么我们不需要对变量shouldDoI进行互锁访问。当然,主线程必须首先等待shouldDoI变为0,然后再设置shouldDoI.JeremyP。你让我意识到在doIt之后和之前设置shouldDoIt为NO的区别。+1对于OSAtomicTestAndClear/SetBarrier();)+1对于代码;)我想我可以对GCD做同样的事情(因为我没有使用NSThread或performSelectorOn…API)