精品文档。1欢迎下载班级姓名:学号:成绩:实验名称 : 生产者和消费者问题1. 实验目的:“生产者消费者”问题是一个著名的同时性编程问题的集合。通过编写经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux 中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。2. 实验内容:“生产者消费者”问题描述如下。有一个有限缓冲区和两个线程: 生产者和消费者。 他们分别把产品放入缓冲区和从缓冲区中拿走产品。 当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。它们之间的关系如下图所示:这里要求用有名管道来模拟有限缓冲区,用信号量来解决生产者消费者问题中的同步和互斥问题。3. 实验方法:(1)使用信号量解决(2)思考使用条件变量解决4. 实验过程(1)信号量的考虑这里使用 3个信号量, 其中两个信号量avail和full分别用于解决生产者和消费者线程之间的同步问题, mutex是用于这两个线程之间的互斥问题。其中avail 初始化为 N(有界缓冲区的空单元数), mutex 初始化为 1,full初始化为 0。/*product.c*/ #include
#include #include #include #include #include #include #include 精品文档。2欢迎下载#define FIFO "myfifo" #define N 5 int lock_var; time_t end_time; char buf_r[100]; sem_t mutex,full,avail; int fd; void pthread1(void *arg); void pthread2(void *arg); int main(int argc, char *argv[]) { pthread_t id1,id2; pthread_t mon_th_id; int ret; end_time = time(NULL)+30; /* 创建有名管道 */ if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)) printf("cannot create fifoserver\n"); printf("Preparing for reading bytes...\n"); memset(buf_r,0,sizeof(buf_r)); /* 打开管道 */ fd=open(FIFO,O_RDWR|O_NONBLOCK,0); if(fd==-1) { perror("open"); exit(1); } /* 初始化互斥信号量为1*/ ret= sem_init(&mutex,0,1); /* 初始化 avail 信号量为 N*/ ret= sem_init(&avail,0,N); /* 初始化 full信号量为 0*/ ret=sem_init(&full,0,0); if(ret!=0) { perror("sem_init"); } /* 创建两个线程 */ ret= pthread_create(&id1,NULL,(void *)product...