实验目的
“生产者消费者”问题是一个著名的同时性编程问题的集合。通过编写经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux 中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。
实验内容
“生产者消费者”问题描述如下。
有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。它们之间的关系如下图所示:
这里要求用有名管道来模拟有限缓冲区,用信号量来解决生产者消费者问题中的同步和互斥问题。
实验步骤
(1)使用信号量解决
(2)思考使用条件变量解决
实验过程
(1信号量的考虑
这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者线程之间的同步问题,mutex是用于这两个线程之间的互斥问题。其中avail初始化为N(有界缓冲区的空单元数),mutex 初始化为1,full初始化为0。
/*product.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
#include <fcntl.h>
#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))

本文探讨了在Linux环境下,通过有名管道和信号量解决经典‘生产者消费者’问题的方法,以及使用条件变量的替代方案。实验中,创建了两个线程,一个生产者线程将产品放入有限缓冲区,一个消费者线程取出产品。通过信号量实现线程同步和互斥,保证了生产者在缓冲区满时不生产,消费者在缓冲区空时不消费。同时,文章还介绍了使用条件变量的缓冲区管理方式,确保了线程间的协调运行。实验结果展示了线程编程的基本操作和作用。
528

被折叠的 条评论
为什么被折叠?



