条件变量基本使用

  • Post author:
  • Post category:其他


一、条件变量

应用场景:生产者消费者问题,是线程同步的一种手段。

必要性:为了实现等待某个资源,让线程休眠。提高运行效率

int pthread_cond_wait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex);

int pthread_cond_timedwait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex,

const struct timespec *restrict abstime);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

二、使用步骤

1.初始化:

静态初始化

pthread_cond_t   cond = PTHREAD_COND_INITIALIZER;      //初始化条件变量

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;  //初始化互斥量

或使用动态初始化

pthread_cond_init(&cond);

2.生产资源线程:



pthread_mutex_lock




(&m




u




t




e




x);



开始产生资源



pthread_cond_sigal(&cond);    //




通知一个消费线程



或者



pthread_cond_broadcast(&cond); //




广播通知多个消费线程



pthread_mutex_unlock(&mutex);



3.消费者线程:


pthread_mutex_lock(&mutex);


while


(如果没有资源)


{   //


防止惊群效应


pthread_cond_wait(&cond, &mutex);


}


有资源了,消费资源


pthread_mutex_unlock(&mutex);



注意:


1 pthread_cond_wait(&cond, &mutex)


,在没有资源等待是是先


unlock


休眠,等资源到了,再


lock


所以


pthread_cond_wait he pthread_mutex_lock


必须配对使用。


2


如果


pthread_cond_signal


或者


pthread_cond_broadcast


早于


pthread_cond_wait


,则有可能会丢失信号。


3 pthead_cond_broadcast


信号会被多个线程收到,这叫线程的惊群效应。所以需要加上判断条件


while


循环。



版权声明:本文为qq_43341187原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。