Эффективно ли ждать изменения состояния флага, не блокируя ресурсы? - PullRequest
1 голос
/ 03 февраля 2009

Поток для ожидания бесконечно в цикле до изменения состояния флага , затем вызов функции.

Иллюстрация псевдокода:

while (true)
{
    while (!flag)
    {
            sleep(1);
    }
    clean_upfunction();
}

В настоящее время

  • Использование многопоточных версий только библиотек времени выполнения C
нет

Нет

  • MFC

Вопрос:

  • Есть ли более эффективный способ реализации вышеуказанного
  • waitForStateChange () - аналогично описанному выше - в библиотеке потоков

Ответы [ 3 ]

10 голосов
/ 03 февраля 2009

Для Windows (для которой у вас есть этот тег) вы хотите посмотреть WaitForSingleObject . Используйте событие Windows (с CreateEvent), затем подождите его; другой поток должен вызвать SetEvent. Все родные Windows, MFC или что-либо еще не требуется.

3 голосов
/ 03 февраля 2009

Если вы не работаете в Windows и вместо этого используете POSIXish, pthread_cond_wait - лучшее совпадение:

/* signaler */
    pthread_mutex_lock(mutex);
    flag = true;
    pthread_cond_signal(cond);
    pthread_mutex_unlock(mutex);

/* waiter */
    pthread_mutex_lock(mutex);
    do {
        pthread_cond_wait(cond, mutex);
    } while (!flag);
    pthread_mutex_unlock(mutex);

Классический трюк с самоотдачей проще и круче :) Работает на системах без pthreads тоже.

/* setup */
    int pipefd[2];
    if (pipe(pipefd) < 0) {
        perror("pipe failed");
        exit(-1);
    }

/* signaler */
    char byte = 0;
    write(pipefd[0], &byte, 1);  // omitting error handling for brevity

/* waiter */
    char byte;
    read(pipefd[1], &byte, 1);  // omitting error handling for brevity

Официант будет блокировать на read (вы не установите O_NONBLOCK) до тех пор, пока не прервется (именно поэтому вы должны обрабатывать ошибки), или сигнализатор пишет байт.

2 голосов
/ 03 февраля 2009

Посмотрите на condition_variable в Boost.Thread.

http://www.boost.org/doc/libs/1_37_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref

Это портативное устройство, более простое в использовании, чем опции, специфичные для платформы. Более того, IIUC, будущая C ++ 0x std :: condition_variable была смоделирована после нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...