我对线程条件变量的初步探究

本文详细解析了生产者-消费者模式中的线程同步问题,包括如何使用互斥锁和条件变量来协调生产者与消费者的运行,确保数据的一致性和同步。通过具体的代码示例展示了两种不同的信号发送时机对消费线程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面这份代码是我的书写方式:

static bool alive = true;

static int count = 0;

pthread_mutex_t mutex;

pthread_cond_t cond;


void producer()

{

      pthread_mutex_lock(&mutex);  //加互斥锁

      //...do something here, queue.insert() ...or create something...

      count++;

     

     //如果像下面这样写,则consumer阻塞到pthread_mutex_lock(&mutex)

     //比pthread_cond_wait(&cond, &mutex)先得到互斥锁控制权。

      pthread_mutex_unlock(&mutex); //解互斥锁

      pthread_cond_signal(&cond);  //唤醒wait(),如果没有wait则什么都不做


     //如果像下面这样写,则consumer阻塞到pthread_mutex_lock(&mutex)

     //比pthread_cond_wait(&cond, &mutex)可能后得到互斥锁控制权。

      pthread_cond_signal(&cond);  //唤醒wait(),如果没有wait则什么都不做

      pthread_mutex_unlock(&mutex); //解互斥锁

}

void consumer()

{

      pthread_mutex_lock(&mutex);//加互斥锁

      while(alive && 0 == count) {   //仅在count == 0 时才wait,而且是while()不是if(),经过测试必须得是while,why?

//因为pthread_cond_wait(&cond, &mutex)分为unlock-》wait-》lock,当像producer像第一种书写顺序,则即使得到signal,

//那么无法获得互斥锁控制权,那么将阻塞在lock上,相当于回退2行到  pthread_mutex_lock(&mutex);

            pthread_cond_wait(&cond, &mutex);  //内部先解互斥锁才睡眠,等唤醒后自动加回互斥锁。

      }

      //... do something here, queue.get() ... or use & delete something

      count --;

      pthread_mutex_lock(&mutex);//解互斥锁

}转载请注明出处,谢谢: http://blog.youkuaiyun.com/sprintfwater/article/details/21190859

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值