Не ждите @synchronized в objectictive-c - PullRequest
       28

Не ждите @synchronized в objectictive-c

0 голосов
/ 09 августа 2011

У меня есть таймер, который раз в минуту выполняет метод. У метода есть некоторый код и вызов NSThread. NSthread вызывает другой метод с критическим разделом.

Иногда выполнение критической секции занимает больше минуты. И мне нужно, чтобы другой поток достиг @synchronized, чтобы не ждать, а выйти из функции без выполнения кода.

В настоящее время я делаю это так, что кажется, что он работает неправильно, и два потока, кажется, входят в критическую секцию.

Код:

BOOL isRunning;
- (void)mainFunction
{
    isRunning = NO;
    [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(glichyFunc) userInfo:nil repeates:YES];
}
- (void)glichyFunc
{
    a++;
    b--;
    [NSThread detachNewThreadSelector:@selector(doJob) toTarget:self withObject:nil];     
}
- (void)doJob
{
    if (isRunning)
        return;

    isRunning = YES;

    @syncronized{
         c = [globalObject calculate];
         isRunning = NO;
    }
}

1 Ответ

4 голосов
/ 09 августа 2011

Вы можете свернуть свою реализацию с использованием NSLock и -tryLock.После этого вы сможете проверить, доступна ли блокировка, и избежать блокировки, если она в данный момент заблокирована другим потоком.

...