在Objective C中同步2个线程

时间:2011-12-27 02:12:44

标签: iphone objective-c synchronization locking

我有2个方法,每个方法都在不同的线程上。

当Method1处于关键部分时,Method2需要等待。 请注意,Method2不断运行,只有在Method1在其关键部分运行时才需要等待。否则,继续其工作..

我该怎么做?

伪码:

Method1
{
       Announce the entrence to critical-section
       ......Do some stuff.........
       Announce the leaving of critical-section
}


Method2
{
       Method1 is in its critical-section? - WAIT TILL IT DONE
       ......Do some stuff...........
}

3 个答案:

答案 0 :(得分:2)

您应该使用条件变量来可靠地控制2个线程之间的行为。从技术上讲,你可以通过共享一个变量来做其他答案建议的内容,但在其他情况下它会很快崩溃。

BOOL isMethod1Busy = NO;
NSCondition *method1Condition = [[NSCondition alloc] init]

- (void)method1
{
    [method1Condition lock];
    isMethod1Busy = YES;

    // do work

    isMethod1Busy = NO;
    [method1Condition signal];
    [method1Condition unlock];
}

- (void)method2
{
    [method1Condition lock];
    while (isMethod1Busy) {
        [method1Condition wait];
    }

    // do stuff while method1 is not working

    [method1Condition unlock];
}

答案 1 :(得分:0)

除了在架构上注意到,你应该将你的软件设计为基于事件而不是你在这里所拥有的,我假设您可以使用NSNotificationCenter在Method1中执行“宣布”部分。

你可以做的另一件事,上面提到的警告,是在实例上设置一个BOOL,说它应该跳过处理:

-(void)method2 {

    if (self.skipProcessing)
        return;

    //normal code here..
}

答案 2 :(得分:0)

您应该使用一些共享变量(在逻辑上分配在两个方法之上)来同步方法。

在这里,我假设你正在使用类似NSThread的东西来处理你的线程。

- (void)Method1:
{
    self.SYNC_LOCK = YES;
    // do some stuff
    self.SYNC_LOCK = NO;
}

- (void)Method2:
{
    if (self.SYNC_LOCK) {return;}
    // do some stuff
}

如果您还在寻找一个简单的线程库,您应该看看Grand Central Dispatch。我有一个库(GCD - GitHub)很好地包装了这些东西。

- (void)Method1
{
    [GCD doInBackground: ^{
        self.SYNC_LOCK = YES;
        // do some stuff
        self.SYNC_LOCK = NO;
    }];
}

- (void)Method2
{
    void (^stuff_block)(void) = ^{
        while (!self.SYNC_LOCK) {sleep(SOME_WAIT_TIME);}
        //do some stuff
    };
    [GCD doInBackground: stuff_block every: FEW_SECONDS];
}