Обработка переменной мьютекса в проверке цикла while - PullRequest
6 голосов
/ 08 мая 2011

Если переменная, которая изменяется в потоке и правильно заблокирована и разблокирована с использованием мьютекса, читается в цикле while в другом потоке, как блокирует и разблокирует мьютекс, чтобы цикл while мог прочитать значение,это даже необходимо?

Я устанавливаю переменную в потоке и проверяю ее в другом потоке, используя цикл while.Как переменная блокируется и разблокируется для проверки состояния цикла while?

Единственный разумный способ сделать это - иметь дополнительную переменную, которая используется для запуска цикла while, и установить для нее значениепеременная, которая нуждается в блокировке / разблокировке?

Ответы [ 3 ]

8 голосов
/ 08 мая 2011

Редактировать : предложение @ ninjalj заменить while -тип с использованием условной переменной - хороший совет , если вы используете while -петл для ждать , пока не будет достигнуто состояние программы. Однако, если вы используете while -loop для , выполняйте работу до тех пор, пока не будет достигнуто состояние программы, тогда ...

Вы должны обернуть код "lock-mutex; examine variable; unlock mutex" в служебную функцию, и тогда ваше условие while -loop может вызвать эту функцию. Например, функция полезности может быть написана, как показано в следующем коде:

int valueOfSharedVariable()
{
    int status;
    int result;

    status = pthread_mutex_lock(&mutex);
    assert(status == 0);
    result = sharedVariable;
    status = pthread_mutex_unlock(&mutex);
    assert(status == 0);
    return result;
}

Тогда ваше условие while -loop может быть записано следующим образом:

while (valueOfSharedVariable() < 10) {
    ...
}
4 голосов
/ 08 мая 2011

Возможно, вам следует использовать условную переменную. См pthread_cond_wait(3) и pthread_cond_signal(3)

0 голосов
/ 08 мая 2011

Вы должны заблокировать его во время чтения, если есть малейший шанс, что кто-то другой пишет в то же время. В противном случае могут произойти все виды вещей, например, вы увидите частичное обновление или его вообще не будет.

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

...