资源简介
在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
- 上一篇:用C++实现的CURE算法的源码
- 下一篇:蒙特卡洛法的程序代码
评论
共有 条评论