Как работает NSCondition? - PullRequest
       34

Как работает NSCondition?

3 голосов
/ 23 декабря 2011

Я использую класс NSCondition в этом смысле:

- (void) method1
{
    [[cocoaCondition lock] lock];
    while (!someCheckIsTrue) {
        [cocoaCondition wait];
    }
    // Do something.
    [cocoaCondition unlock];
}

- (void) method2
{
    [cocoaCondition lock];
    // Do something.
    someCheckIsTrue = YES;
    [cocoaCondition signal];
    [cocoaCondition unlock];
}

У меня два потока, thread1 запускает method1, а thread2 запускает method2. Я надеюсь, что при вызове [cocoaCondition wait] поток1 будет заблокирован. Затем, когда thread2 вызывает [cocoaCondition signal], thread1 возобновляет работу. Я протестировал код, и он работает так, как я надеюсь.

Но, как видите, когда работает код:

шаг 1, thread1 вызывает: [cocoaCondition lock] (Apple сообщает: пытается получить блокировку, блокируя выполнение потока до тех пор, пока блокировка не будет получена)

шаг 2, нить1 вызывает: [cocoaCondition wait]
шаг 3, thread2 вызывает: [cocoaCondition lock] (Следуя документу Apple, thread2 должен быть заблокирован)
шаг 4, thread2 вызывает: [cocoaCondition signal] (Таким образом, thread2 должен быть заблокирован и не может вызывать этот метод, пока не будет вызван [cocoaConditon unlock])

Я думаю, что мой код заблокирован, но почему бы и нет? Так что я думаю, что условие какао разблокировано, когда thread1 вызывает [cocoaCondition wait] на шаге 2, не так ли?

1 Ответ

6 голосов
/ 11 апреля 2012

Классификация по условию NSC

В документе говорится: «Когда поток ожидает условия, объект условия разблокирует свою блокировку и блокирует поток. Когда сигнализируется условие, система пробуждает поток. Затем объект условия восстанавливает свою блокировку перед возвратом из wait или waitUntilDate: метод. Таким образом, с точки зрения потока, он как бы всегда удерживал блокировку. "

Ваше предположение было верным.

...