• 大小: 162KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: C/C++
  • 标签: PCP  

资源简介

在Linux操作系统下用C或C++实现经典同步问题:生产者-消费者问题。 含源代码和文档。 内容: 1.一个大小为10的缓冲区,初始状态为空。 2.2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复10次。 3.2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复10次。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

/*信号量*/
//空的信号量和满的信号量
sem_t empty_sem full_sem;   
//静态创建条件变量
pthread_cond_t full = PTHREAD_COND_INITIALIZER;        //满的变量
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;       //空的变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;      //互斥锁

#define BUFFERNUM 10    

//缓冲区队列
struct Buffer_Queue {
char production[BUFFERNUM];  //产品
int front rear;             //头指针和尾指针
int num;                     //缓冲区里面字母数量        
};

//输出设计者信息
void printDesign()
{
printf(“   ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n“);
printf(“   ┃            生产者-消费者问题实现                 ┃\n“);
printf(“   ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n“);
}

//随机产生生产字符
char getRandChar()
{
int temp = rand()%26;
return (‘a‘+temp);
}

//打印进程运行结果
void printTime()
{
//打印时间
time_t now;
struct tm *timenow;         //实例化tm结构指针
time(&now);
timenow = localtime(&now);
printf(“执行时间: %s “asctime(timenow));
}

//生产者1
void *producer1(void *arg)
{
struct Buffer_Queue *q;
q = (struct Buffer_Queue *) arg;
while(1)
{
pthread_mutex_lock(&lock);       
while (q->num == BUFFERNUM)    //缓冲区已经满了,等待
{            
pthread_cond_wait(&full &lock);
}
sem_wait(&empty_sem);

/*生产产品*/
char c = getRandChar();                                      //随机获取字母
q->rear = (q->rear + 1) % BUFFERNUM;                         //计算新的尾指针   
q->production[q->rear] = c;                                  //写入新产品
q->num++;

/*打印输出结果*/
printf(“-------------------------------------------------------------\n“);
printTime();              //程序运行时间
int i;
printf(“缓冲区数据(%d个):“q->num);                  //打印缓冲区中的数据
if(q->front < q->rear)
{
for(i = q->front; i <= q->rear; i++)
printf(“%c “q->production[i]);
}
else
{
for(i = q->front; i < BUFFERNUM; i++)
printf(“%c “q->production[i]);
for(i = 0; i <= q->rear; i++)
printf(“%c “q->production[i]);
}
printf(“\n当前执行的进程:生产者1\n“);   //打印当前执行的进程
printf(“产生的数据:%c\n“c);      //打印产生或消费的数据
printf(“-------------------------------------------------------------\n“);

sem_post(&full_sem);

if (q->num == 1) {
pthread_cond_signal(&empty);    
}
pthread_mutex_unlock(&lock); 

sleep(rand() % 2);            
}
}

//生产者2
void *producer2(void *arg)
{
struct Buffer_Queue *q;
q = (struct Buffer_Queue *) arg;
while(1)
{
pthread_mutex_lock(&lock);       
while (q->num == BUFFERNUM)    //缓冲区已经满了,等待
{            
pthread_cond_wait(&full &lock);
}
sem_wait(&empty_sem);

/*生产产品*/
char c = getRandChar();                                      //随机获取字母
q->rear = (q->rear + 1) % BUFFERNUM;                         //计算新的尾指针   
q->production[q->rear] = c;                                  //写入新产品  
q->num++;

/*打印输出结果*/
printf(“-------------------------------------------------------------\n“);
printTime();              //程序运行时间
int i;
printf(“缓冲区数据(%d个):“q->num);        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     233984  2013-08-07 19:34  生产者-消费者问题\文档.doc

     文件       8144  2013-08-07 19:43  生产者-消费者问题\源代码\ProducerConsumer.c

     目录          0  2013-08-07 19:43  生产者-消费者问题\源代码

     目录          0  2013-08-07 19:48  生产者-消费者问题

----------- ---------  ---------- -----  ----

               242128                    4


评论

共有 条评论