2009-07-07 2 views

ответ

8

Я не очень хорошо знаком с ManualResetEvent, но based on the documentation, похоже, что the NSCondition class может быть тем, что вы ищете.

NSCondition ни в коем случае не является точным эквивалентом, но он обеспечивает аналогичную функциональность сигнализации. Вы также можете прочитать на NSLock.

+1

Чтение документов, похоже, делает именно то, что мне нужно. Благодаря! – Lounges

+0

Похоже, что NSCondition больше похожа на AutoResetEvent, а не на ManualResetEvent. – Brett

+0

Ознакомьтесь с этим полезным примером: http: //stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett

0

А, это переменные состояния бедных людей.

Вы можете использовать класс NSCondition, но я думаю, что лучше пойти
, чтобы перейти прямо к исходному коду. Начните с pthread_cond_init.

Вам понравится.

+0

NSCondition - это оболочка более высокого уровня вокруг pthreads. Если интерфейс NSCondition/NSLock выполняет задание, нет необходимости идти на низкоуровневый уровень. – Naaff

+0

Ну, я думаю, вы можете сделать это легко. –

1

Я дам вам образец кода, который мне бы хотелось найти вчера (но не смог найти нигде). Если вы хотите создать класс производителя/потребителя, в котором потребитель является асинхронным, это то, что вам нужно сделать:

Вам необходимо объявить и выделить NSConditionLock.

NSArray * data = [self getSomeData]; 

if ([data count] == 0) { 
    NSLog(@"sendThread: Waiting..."); 
    [_conditionLock lockWhenCondition:1]; 
    [_conditionLock unlockWithCondition:0]; 
    NSLog(@"sendThread: Back to life..."); 
} 
else { 
    // Processing 
} 

И в основном коде, когда вы добавляете данные, и вы хотите, чтобы разблокировать другую тему, вы просто должны добавить:

[_conditionLock lock]; 
[_conditionLock unlockWithCondition:1]; 

Примечание: Я не здесь описывать, как данные обмен между производителем и потребителем. В моей программе он проходил через базу данных SQLite/CoreData, поэтому синхронизация потоков выполняется на более высоком уровне. Но если вы используете NSMutableDictionary, вам нужно добавить NSLock.

0

Вот класс оболочки, который я создал, который эмулирует ManualResetEvent, используя NSCondition.

@interface WaitEvent : NSObject { 
    NSCondition *_condition; 
    bool _signaled; 
} 

- (id)initSignaled:(BOOL)signaled; 
- (void)waitForSignal; 
- (void)signal; 

@end 

@implementation WaitEvent 

- (id)initSignaled:(BOOL)signaled 
{ 
    if (self = ([super init])) { 
     _condition = [[NSCondition alloc] init]; 
     _signaled = signaled; 
    } 

    return self; 
} 

- (void)waitForSignal 
{ 
    [_condition lock]; 
    while (!_signaled) { 
     [_condition wait]; 
    } 

    [_condition unlock]; 
} 

- (void)signal 
{ 
    [_condition lock]; 
    _signaled = YES; 
    [_condition signal]; 
    [_condition unlock]; 
} 

@end 

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

Смежные вопросы