输入2 2 15测试
#include<iostream>
#include<pthread.h>
#include<ctime>
#include <unistd.h>
#include<queue>
#include<semaphore.h>
using namespace std;
pthread_mutex_t mutexs;
pthread_mutex_t print;
pthread_mutex_t all;
pthread_cond_t full=PTHREAD_COND_INITIALIZER;
pthread_cond_t empty=PTHREAD_COND_INITIALIZER;
int k;
typedef struct item_st{
int product_id;
time_t produce_time;
int producer_id;
}ITEM;
typedef struct buffer_st{
bool isempty=true;
ITEM item;
int len=0;
buffer_st * nextbuf= nullptr;
}BUFFER;
BUFFER product;
int allproductid=1;
int allcustomer=0;
int maxn=4;
void *customer(void *arg){
while(true){
int *customer_id=(int *)arg;
pthread_mutex_lock(&mutexs);
pthread_mutex_lock(&print);
cout<<"消费者"<<*customer_id<<"准备进入临界区"<<endl;
pthread_mutex_unlock(&print);
if(allcustomer>=k){
cout<<"结束!!!!"<<endl;
pthread_mutex_unlock(&mutexs);
pthread_exit(NULL);
}
while(product.len==0){
pthread_cond_signal(&empty);
pthread_cond_wait(&full,&mutexs);
}
pthread_mutex_lock(&print);
cout<<"消费者"<<*customer_id<<"已经进入临界区"<<endl;
pthread_mutex_unlock(&print);
allcustomer+=1;
BUFFER* temp=&product;
for(int i=1;i<product.len;i++){
temp=temp->nextbuf;
}
pthread_mutex_lock(&print);
cout<<"消费者"<<*customer_id<<"取出产品id为"<<temp->item.product_id<<endl;
pthread_mutex_unlock(&print);
int cur=temp->item.product_id;
pthread_mutex_lock(&print);
cout<<"该产品是生产者"<<temp->item.producer_id<<"于"<<ctime(&temp->item.produce_time)<<"生产"<<endl;
pthread_mutex_unlock(&print);
temp= nullptr;
product.len--;
pthread_mutex_lock(&print);
cout<<"-----------此时缓冲区内有如下----------"<<endl;
cout<<"生产时间\t\t\t"<<"生产者\t"<<"产品id"<<endl;
BUFFER *list=&product;
for(int i=0;i<product.len;i++){
cout<<ctime(&(list->item.produce_time))<<"\t"<<list->item.producer_id<<"\t"<<list->item.product_id<<endl;
if(i<product.len-1)
list=list->nextbuf;
}
pthread_mutex_unlock(&print);
pthread_mutex_lock(&print);
cout<<"--------------------------"<<endl;
cout<<"消费者"<<*customer_id<<"已经离开临界区"<<endl;
pthread_mutex_unlock(&print);
pthread_mutex_unlock(&mutexs);
pthread_cond_signal(&empty);
int during=rand()%5+1;
pthread_mutex_lock(&print);
cout<<"消费者"<<*customer_id<<"开始消费"<<cur<<endl;
pthread_mutex_unlock(&print);
sleep(during);
time_t t;
time(&t);
pthread_mutex_lock(&print);
cout<<"消费者"<<*customer_id<<"于"<<ctime(&t)<<"消费产品"<<cur<<"完毕"<<",用时"<<during<<"s"<<endl;
pthread_mutex_unlock(&print);
}
return 0;
}
void *producer(void *arg){
int current_product;
while(true){
int *producer_id=(int *)arg;
pthread_mutex_lock(&all);
current_product=allproductid;
if(allproductid==k+1){
cout<<"退出!!!!"<<endl;
pthread_mutex_unlock(&all);
pthread_exit(NULL);
}
allproductid++;
int during=rand()%5+1;
pthread_mutex_lock(&print);
cout<<"生产者"<<*producer_id<<"开始生产产品"<<current_product<<endl;
pthread_mutex_unlock(&print);
sleep(during);
time_t t;
time(&t);
pthread_mutex_lock(&print);
cout<<"生产者"<<*producer_id<<"于"<<ctime(&t)<<"生产完毕"<<",用时"<<during<<"s"<<endl;
pthread_mutex_unlock(&print);
pthread_mutex_unlock(&all);
pthread_mutex_lock(&mutexs);
pthread_mutex_lock(&print);
cout<<"生产者"<<*producer_id<<"准备进入临界区"<<endl;
pthread_mutex_unlock(&print);
while(product.len==maxn){
pthread_cond_signal(&full);
pthread_cond_wait(&empty,&mutexs);
}
pthread_mutex_lock(&print);
cout<<"生产者"<<*producer_id<<"已经进入临界区"<<endl;
pthread_mutex_unlock(&print);
BUFFER *temp=&product;
if(product.len==0){
temp->isempty= false;
temp->item.producer_id=*producer_id;
temp->item.produce_time=t;
temp->item.product_id=current_product;
temp->nextbuf= nullptr;
product.len=1;
}
else if(product.len<maxn){
for(int i=0;i<product.len;i++){
temp=temp->nextbuf;
}
BUFFER *one=new BUFFER ;
one->isempty= false;
one->item.producer_id=*producer_id;
one->item.produce_time=t;
one->item.product_id=current_product;
one->nextbuf= nullptr;
temp=one;
product.len++;
}
pthread_mutex_lock(&print);
cout<<"生产者"<<*producer_id<<"已经把产品"<<current_product<<"放入缓冲区"<<endl;
cout<<"-----------此时缓冲区内有如下----------"<<endl;
cout<<"生产时间\t\t\t"<<"生产者\t"<<"产品id"<<endl;
BUFFER *list=&product;
for(int i=0;i<product.len;i++){
cout<<ctime(&(list->item.produce_time))<<"\t"<<list->item.producer_id<<"\t"<<list->item.product_id<<endl;
if(i==product.len-1)
break;
}
pthread_mutex_unlock(&print);
pthread_mutex_lock(&print);
cout<<"-----------------------"<<endl;
cout<<"生产者"<<*producer_id<<"已经离开临界区"<<endl;
pthread_mutex_unlock(&print);
pthread_mutex_unlock(&mutexs);
pthread_cond_signal(&full);
}
return 0;
}
int main(){
pthread_mutex_init(&mutexs,NULL);
pthread_mutex_init(&print,NULL);
pthread_mutex_init(&all,NULL);
int c_num,p_num;
cin>>p_num>>c_num>>k;
pthread_t pro_thread[10];
pthread_t cus_thread[10];
int a,b,c,d;
int c1=1;
int c2=2;
int c3=3;
int c4=4;
int p1=1;
int p2=2;
for(a=0;a<p_num;a++){
if(a==0) {
pthread_create(&pro_thread[a], NULL, producer, (void *) &p1);
}
if(a==1){
pthread_create(&pro_thread[a], NULL, producer, (void *) &p2);
}
}
for(b=0;b<c_num;b++){
if(b==0) {
pthread_create(&cus_thread[b], NULL, customer, (void *) &c1);
}
if(b==1){
pthread_create(&cus_thread[b], NULL, customer, (void *) &c2);
}
if(b==2){
pthread_create(&cus_thread[b], NULL, customer, (void *) &c3);
}
}
for(c=0;c<p_num;c++){
pthread_join(pro_thread[c],NULL);
}
for(d=0;d<c_num;d++){
pthread_join(cus_thread[d],NULL);
}
pthread_mutex_destroy(&mutexs);
pthread_mutex_destroy(&print);
return 0;
}
原文地址:http://www.cnblogs.com/NKshen/p/16866786.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性