头歌操作系统生产者消费者问题实践第1关

概要

第1关:生产者消费者问题实践

任务描述

生产者—消费者之间设置一个具有n个缓存区的缓冲池,生产者进程将他所生产的产品放入一个缓冲区;消费者进程可以从一个缓冲区中取走产品去消费。

不允许消费者进程到一个空缓冲去取产品。
不允许生产者进程向一个已装满产品且尚未取走的缓冲区投放产品。

使用多线程实现生产者和消费者问题模型,使用锁和信号量控制线程之间的同步。

整体命令流程

在这里插入图片描述
在这里插入图片描述

编程要求

请参考生产者线程的函数代码实现消费者线程的函数代码,将Consumer()函数补充完整

多线程相关的系统调用

include <pthread.h>
创建线程 pthread_create
pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument);
线程创建函数包含四个变量,分别为:
1.一个线程变量名,被创建线程的标识
2. 线程的属性指针,缺省为NULL即可
3. 被创建线程的程序代码
4. 程序代码的参数

线程等待 pthread_join
pthread_create调用成功以后,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度,如果我们需要等待指定线程结束,需要使用pthread_join函数,这个函数实际上类似与多进程编程中的waitpid。 举个例子,以下假设 A 线程调用 pthread_join 试图去操作B线程,该函数将A线程阻塞,直到B线程退出,当B线程退出以后,A线程会收集B线程的返回码。 该函数包含两个参数:
在这里插入图片描述

使用锁控制进程互斥

在主线程中初始化锁为解锁状态
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
访问对象时的加锁操作与解锁操作
加锁 pthread_mutex_lock(&mutex)
释放锁 pthread_mutex_unlock(&mutex)

利用信号量实现进程同步

先引入头文件 #include <semaphore.h>
初始化信号量: int sem_init(sem_t *sem, int pshared, unsigned int value);
成功返回0,失败返回-1
参数
sem:指向信号量结构的一个指针
pshared: 不是0的时候,该信号量在进程间共享,否则只能为当前进程的所有线程们共享
value:信号量的初始值
信号量减1操作,当sem=0的时候该函数会堵塞 int sem_wait(sem_t *sem);
成功返回0,失败返回-1
参数
sem:指向信号量的一个指针
信号量加1操作 int sem_post(sem_t *sem);
参数与返回同上
销毁信号量 int sem_destroy(sem_t *sem);
参数与返回同上

测试说明

需要打印出生产者和消费者线程并发执行的情况,并满足题目所示的限制条件
预期输出结果类似下面这样。因为调度次序随机,执行结果可能和这个不同,但需要满足题目限制要求。
Produce one message:1
Consume one message:1
Produce one message:2
Consume one message:2
Produce one message:3
Consume one message:3
Produce one message:4
Consume one message:4
Produce one message:5
Consume one message:5
Produce one message:6
Produce one message:7
Consume one message:6
Consume one message:7
Produce one message:8
Produce one message:9
Consume one message:8
Produce one message:10
Consume one message:9
Consume one message:10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值