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

Я использую класс 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];
}

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

Но, как видите, при запуске кода:

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

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

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


person schumyxp    schedule 23.12.2011    source источник
comment
Зачем нужен цикл while? Разве вы не можете просто вызвать ожидание, а затем, как только сигнал будет вызван, ожидание выйдет?   -  person jjxtra    schedule 12.12.2012
comment
@jjxtra из документа Apple NSCondition: логический предикат является важной частью семантики использования условий из-за того, как работает сигнализация. Сигнализация условия не гарантирует, что само условие истинно. Существуют проблемы синхронизации, связанные с передачей сигналов, которые могут вызывать появление ложных сигналов.   -  person Gobe    schedule 03.06.2016


Ответы (1)


Справочник по классу NSCondition

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

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

person MasterBeta    schedule 11.04.2012