#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAX_STOCK 20 //仓库容量
char g_storage[MAX_STOCK];
size_t g_stock=0; //当前库存
//互斥量
pthread_mutex_t g_mtx=PTHREAD_MUTEX_INITIALIZER;
//条件变量
pthread_cond_t g_full=PTHREAD_COND_INITIALIZER;//满仓
pthread_cond_t g_empty=PTHREAD_COND_INITIALIZER;//空仓
//显示库存
void show(const char *who,const char *op,char prod)
{
printf("%s:",who);
size_t i;
for(i=0;i<g_stock;++i)
{
printf("%c",g_storage[i]);
}
printf("%s%c\n",op,prod);
}
//生产者线程
void *produce(void *arg)
{
const char *who=(const char*)arg;
for(;;)
{
pthread_mutex_lock(&g_mtx); //上锁,独享g_stock内部资源
if(g_stock>=MAX_STOCK) //生产数量大于20
{
printf("%s:OKOKOKOKOKOKOKOKOKOKOK\n",who);
//pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)
//函数中的第二个参数是一个互斥量,用于对条件变量保护
//该函数会将调用线程阻塞在cond这个条件变量上,将它放在等待条件的线程列表中,
//同时对互斥锁解锁,是的其它线程可以访问资源
pthread_cond_wait(&g_full,&g_mtx); //库存太多,生产太快,将生产者线程阻塞在满仓条件变量上。release mutex
}
char prod='A'+rand()%26;
show(who,"<-",prod);
g_storage[g_stock++]=prod;
//pthread_cond_signal()用来给阻塞的线程发送信号来唤醒等待cond条件的线程。
pthread_cond_signal(&g_empty);
pthread_mutex_unlock(&g_mtx);
usleep((rand()%100)*1000);
}
return NULL;
}
//消费者线程
void *customer(void *arg)
{
const char *who=(const char*)arg;
for(;;)
{
pthread_mutex_lock(&g_mtx); //上锁
if(!g_stock)
{
printf("%s:NONONONONONONO!\n",who);
pthread_cond_wait(&g_empty,&g_mtx); //没库存,消费太快,将消费者线程堵塞在空仓条件变量上,
}
char prod=g_storage[--g_stock];
show(who,"->",prod);
pthread_cond_signal(&g_full); //通知生产者可以进行生产了
pthread_mutex_unlock(&g_mtx); //解锁
usleep((rand()%100)*1000);
}
return NULL;
}
int main()
{
srand(time(NULL));
pthread_attr_t attr;
pthread_attr_init(&attr);
//对线程设置分离属性状态
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_t tid;
pthread_create(&tid,&attr,produce,NULL);
pthread_create(&tid,&attr,customer,NULL);
getchar();
return 0;
}
#include <stdio.h>
#include <string.h>
#include