学习多线程时关于遇到问题自己的猜想,不知道对不对,请多指正。
先来看一段代码,就是著名的生产者消费者问题。
#include <pthread.h>
#include <stdio.h>
char store[5];
int g_size = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZE;
//控制满仓的条件变量
pthread_cond_t full = PTHREAD_COND_INITIALIZE;
//控制空仓的条件变量
pthread_comd_t empty = PTHREAD_COND_INITIALIZE;
void print()
{
int i;
for(i = 0; i< g_size ; i++)
printf("%c ",store[i]);
printf("\n");
}
//生产者
void* producer(void* p)
{
char ch = 'A';
for(;ch<5;ch++)
{
pthread_mutex_lock(&mutex);
if(g_size == 5)
//满仓,生产者睡眠
pthread_cond_wait(&full,&mutex);
store[g_size++] = ch;
print();
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&empty);
// sleep(1);
}
}
void* customer(void* p)
{
int i = 0;
for(;i<26;i++)
{
pthread_mutex_lock(&mutex);
if(g_size == 0)
pthread_cond_wait(&empty);
g_size--;
print();
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&full);
// sleep(1);
}
}
int main()
{
pthread_t id[2];
pthread_create(&id[0],NULL, producer, NULL);
pthread_create(&id[1]; NULL, customer,NULL);
pthread_join(&id[0],NULL);
pthread_join(&id[1],NULL);
return 0;
}
结果如图所示。
有很多问题,生产者每次循环生成了一个字符,然后接着唤醒一个消费者,得到的结果应该是生产一个就消费一个,但实际的结果是先生产5个,然后再消费5个,为什么会出现这种情况呢?我分析原因,应该是唤醒的那个函数即pthread_cond_signal()太消耗资源了,需要消耗大量时间片,即唤醒消费者线程要很长时间,所以生产者继续生产了5个,然后生产者睡眠,等待消费者唤醒,然后开始消费,以此类推,消费5个后生产者才又被唤醒。
因此,我加几句代码验证一下,分别在生产者和消费者的唤醒函数后加sleep(1),保证有足够的时间执行唤醒函数,得到的结果符合预测,生产者生产一个消费者然后消费者消费一个。