/*
*生产者消费者问题
* */
#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
*producer(
void
*arg)
{
const
char
*who=(
const
char
*)arg;
for
(;;)
{
pthread_mutex_lock (&g_mtx);
if
(g_stock>=MAX_STOCK)
{
printf
(
"%s:满仓\n"
,who);
pthread_cond_wait(&g_full,&g_mtx);
}
char
prod=
'A'
+
rand
()%26;
show(who,
"<-"
,prod);
g_storage[g_stock++]=prod;
pthread_cond_signal(&g_empty);
pthread_mutex_unlock(&g_mtx);
usleep((
rand
()%100)*1000);
}
return
NULL;
}
//消费者线程
void
*customer(
void
*arg)
{
// usleep(10000);
const
char
*who=(
const
char
*)arg;
for
(;;)
{
pthread_mutex_lock(&g_mtx);
if
(!g_stock)
{
printf
(
"%s:空仓!\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,producer,
"生产者"
);
pthread_create(&tid,&attr,customer,
"消费者"
);
getchar
();
return
0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)