何时使用pthread条件变量?

Mic*_*ser 18 c linux pthreads

pthread问题;

看来条件变量只有在另一个线程调用pthread_cond_notify之前调用pthread_cond_wait时才有效.如果在等待之前以某种方式通知,则等待将被卡住;

我的问题是; 什么时候应该使用条件变量?调度程序可以抢占线程并在等待之前通知发生;

等待信号量没有这个问题 - 这些有一个计数器,还是什么时候条件变量更好?

这是一个测试

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// test of conditional variables;
// if cond-var is notified before wait starts, then wait never wakes up !!!
// better to use semaphores than this crap.

pthread_mutex_t cond_var_lock =  PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;

int wait_first = 1;

void *tfunc(void *arg)
{
    (void) arg;

    if (!wait_first)
        sleep(1);

    fprintf(stderr,"on enter cond_var_lock %lx\n", pthread_self());
    pthread_mutex_lock( &cond_var_lock);
    fprintf(stderr,"before pthread_cond_wait %lx\n", pthread_self());
    pthread_cond_wait( &cond_var, &cond_var_lock);
    fprintf(stderr,"after pthread_cond_wait %lx\n", pthread_self());
    pthread_mutex_unlock( &cond_var_lock);
    fprintf(stderr,"after exit cond_var_lock %lx\n", pthread_self());

    return 0;
}

int main(int argc, char *argv[])
{
    pthread_t th;

    if (argc > 0) 
    wait_first = atoi( argv[1] );

    if (wait_first)
    {
        fprintf(stderr,"********* Wait first ***********\n");
    } else {
        fprintf(stderr,"********* Notify first *********\n");
    }


    pthread_create( &th, 0, tfunc, 0 );

    if (wait_first)
    {
        sleep(1);
    } 

    fprintf(stderr, "! on enter cond_var_lock %lx\n", pthread_self());
    pthread_mutex_lock( &cond_var_lock);
    fprintf(stderr, "! before pthread_cond_signal %lx\n", pthread_self());
    pthread_cond_signal( &cond_var );
    fprintf(stderr, "! after pthread_cond_signal %lx\n", pthread_self());
    pthread_mutex_unlock( &cond_var_lock);
    fprintf(stderr, "! after exit cond_var_lock %lx\n", pthread_self());

    sleep(5);
    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

chi*_*ill 45

条件变量应该用作等待和通知的地方.它们不是条件本身,它们不是事件.条件包含在周围的编程逻辑中.条件变量的典型使用模式是

// safely examine the condition, prevent other threads from
// altering it
pthread_mutex_lock (&lock);
while ( SOME-CONDITION is false)
    pthread_cond_wait (&cond, &lock);

// Do whatever you need to do when condition becomes true
do_stuff();
pthread_mutex_unlock (&lock);
Run Code Online (Sandbox Code Playgroud)

另一方面,发出条件变量信号的线程通常看起来像

// ensure we have exclusive access to whathever comprises the condition
pthread_mutex_lock (&lock);

ALTER-CONDITION

// Wakeup at least one of the threads that are waiting on the condition (if any)
pthread_cond_signal (&cond);

// allow others to proceed
pthread_mutex_unlock (&lock)
Run Code Online (Sandbox Code Playgroud)

  • 如果你调用`pthread_cond_wait`就意味着条件为false.在此期间它不能改变,因为它受互斥锁的保护.条件中的阻塞和互斥锁的相应解锁是原子的. (3认同)
  • 在第一个块中,您还可以调用 do_stuff(); 在 pthread_mutex_unlock (&amp;​​lock); 之后 (2认同)
  • @Sam,可以从`pthread_cond_wait`调用返回,条件仍然(或再次!)为false.因此它应该再次测试,因此循环.没关系,它仍然不是一个繁忙的等待,轮询循环.:) (2认同)