Использование условия pthread ожидает в структуре - PullRequest
2 голосов
/ 08 апреля 2009

Ранее я спрашивал о синхронизации двух потоков без использования pthread_join, и мне удалось разрешить его, используя pthread_cond_wait и pthread_cond_signal. Я написал небольшую структуру для объединения этих функций в одном месте:

struct ConditionWait
{
    int                 i_ConditionPredicate;
    pthread_mutex_t     lock_Var;
    pthread_cond_t      cond_Var;
    int                 i_ValidResult;

    ConditionWait()
    {
        pthread_mutex_init(&lock_Var, NULL);
        pthread_cond_init(&cond_Var, NULL);
        i_ValidResult = 1;
        i_ConditionPredicate = 0;
    }

    void Signal()
    {
        pthread_mutex_lock(&lock_Var);
        i_ConditionPredicate = i_ValidResult;
        pthread_cond_signal(&cond_Var);
        pthread_mutex_unlock(&lock_Var);
    }

    void Wait()
    {
        pthread_mutex_lock(&lock_Var);

        while(i_ConditionPredicate != i_ValidResult)
        {
            pthread_cond_wait(&cond_Var, &lock_Var);
        }
        pthread_mutex_unlock(&lock_Var);
    }
};

Если предположить, что я вызываю Wait () и Signal () из двух разных потоков, это будет потокобезопасным. Может ли взятие одной и той же блокировки в двух функциях одного и того же объекта вызвать взаимоблокировки или условия гонки?

Edit: я использую это сейчас в моей программе, и она отлично работает. Я не слишком уверен, что это просто удача

1 Ответ

5 голосов
/ 08 апреля 2009

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

PS: Вы также должны использовать pthread_mutex_destroy() и pthread_cond_destroy() в деструкторе этой вещи.

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