功能描述:
生产者线程 每隔2秒生产出一批数据直到队列满。
消费者线程 一有数据立即从队列 取出所有数据
代码:
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
//消费者线程
void consume()
{
while (1)
{
pthread_mutex_lock(&qlock);
while (q.size() == 0) //等待条件变量
{
pthread_cond_wait(&qready,&qlock);
}
//此时队列不为空,直接消费数据
while (q.size() > 0)
{
int topValue = q.front();
q.pop();
cout << "消费者消费数据 " << topValue << "剩余个数=" << q.size() << endl;
}
pthread_mutex_unlock(&qlock);
}
}
//生产者线程--每隔n秒生产一批数据,然后及时通知消费者
void produce()
{
static int count = 0;
while (1)
{
sleep(2);
pthread_mutex_lock(&qlock);
while (q.size() < MAXSIZE)
{
int val = ((count++) % MAXSIZE) + 1;
q.push(val);
cout << "生产数据 " << val << ",剩余个数=" << q.size() << endl;
pthread_cond_signal(&qready);
}
pthread_mutex_unlock(&qlock);
}
}
Q1:输出如图
按照我预想的,发出signal后,为什么不是如下这种输出呢?
生产数据1,剩余个数1
消费数据1,剩余个数0
生产数据2,剩余个数1
消费数据2,剩余个数0
Q2: 我如果不加锁,不也用条件变量,相关pthread代码都删除,好像也能正常运行。
这个意义何在,线程竞争具体在哪。
第一次发帖求问,谢谢各位~
你一直拿着锁生产,消费者拿不到锁没法消费。直到都生产完了。