О pthread_cond_signal и pthread_cond_wait - PullRequest
1 голос
/ 28 июня 2011

У меня есть вопросы по поводу pthread_cond_signal и pthread_cond_wait . Например, в приведенном ниже коде, насколько я понимаю, когда inc_count вызывает pthread_cond_signal , count + = 125 в watch_count может быть выполняется только после разблокировки count_mutex в inc_count .

count_mutex был разблокирован в watch_count при выполнении pthread_cond_wait и блокируется только после pthread_mutex_unlock в inc_count выполнен. Я прав?

void *inc_count(void *t) 
{
    int i;
    long my_id = (long)t;

    for (i = 0; i < TCOUNT; i++) 
    {
        pthread_mutex_lock(&count_mutex);
        count++;

        if (count == COUNT_LIMIT) 
        {
            pthread_cond_signal(&count_threshold_cv);
        }

        pthread_mutex_unlock(&count_mutex);
    }

    pthread_exit(NULL);
}

void *watch_count(void *t) 
{
    long my_id = (long)t;

    pthread_mutex_lock(&count_mutex);
    while (count < COUNT_LIMIT)
    {
        pthread_cond_wait(&count_threshold_cv, &count_mutex);
        count += 125;
    }

    pthread_mutex_unlock(&count_mutex);
    pthread_exit(NULL);
}

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

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

Итак, если watch_count() заблокирован в pthread_cond_wait(), и inc_count() запускается и вызываетpthread_cond_signal(), тогда watch_count() не вернется с pthread_cond_wait(), пока inc_count() не вызовет pthread_mutex_unlock().

Однако pthread_cond_wait() может проснуться, даже если не будет сообщено.Это называется ложным пробуждением.watch_count() может поэтому выполнить count+=125 много раз, даже если inc_count() никогда не запускается или никогда не вызывает pthread_cond_signal().

0 голосов
/ 28 июня 2011

count + = 125 в watch_count может быть выполнено только после разблокировки count_mutex в inc_count

Да.

Счетчик_mutex был разблокирован в watch_count при выполнении pthread_cond_wait и блокируется только после выполнения pthread_mutex_unlock в inc_count.

Да, в том смысле, что когда pthread_cond_wait возвращает watch_count, удерживает мьютекс, и, таким образом, он возвращается только после того, как inc_count разблокирует мьютекс. (При условии, что COUNT начинается ниже COUNT_LIMIT при первом достижении while ..)

Кстати: этот код немного болит голова. Я действительно не рекомендовал бы изменять count в watch_count, так как поток управления может быть трудно понять, если у вас когда-либо будет более одного потока, выполняющего эту функцию, и вы начнете использовать pthread_cond_broadcast.

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