计算机操作系统实验-生产者消费者同步控制

线程并发引起的同步问题

        线程以并发形式运行,当并发的线程间访问共享数据时,会发后争用现象,不进行同步控制的线程运行会造成不恰当的结果。

生产者消费者同步问题

        生产者消费者是典型的同步问题,他们共享了一个缓冲池(全局变量数组),当缓冲池有空位时生产者线程向缓冲池中依次赋值,如果缓冲池满则等待。当缓冲池中有数据时消费者线程从中取走数据,如果缓冲池空则等待。

如何解决线程间访问共享变量的冲突问题

当多个线程访问同一个共享变量时,共享变量成为临界资源,它需要操作系统提供同步控制机制,以保证多个线程可以依序访问,当一个线程操作临界资源时其它线程不会中断其操作,因此对临界资源的操作是安全的。

需要使用到的头文件和方法
#include <semaphore.h>
int sem_init(sem_t * sem, int pshared, unsigned int value);//创建信号量变量,value是信号量的初值
int sem_destroy(sem_t *sem);//销毁信号量
int sem_post(sem_t * sem); //信号量值增加1,并激活处于等待状态的线程
int sem_wait(sem_t * sem); //信号量值减少1 为0时将调用该方法的线程被OS阻塞

代码实现

//stu001.c 生产者消费者同步控制,由学生完成缺失代码。 
//主线程序启动生产者线程和消费者线程,全局变量初值为0
//生产者线程向全局变量进行10次赋值(代表生产),消费者线程从全局变量读取值,/
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是经典的并发编程问题,它涉及到多个线程之间的协作与同步。在生产者消费者问题中,有两类线程:生产者线程和消费者线程。生产者线程负责生产数据,消费者线程负责消费数据。生产者线程和消费者线程之间通过一个有限容量的缓冲区进行数据交换。 在计算机操作系统中,我们可以通过使用信号量来解决生产者消费者问题。信号量是一种同步机制,用于实现线程之间的互斥和同步。 在生产者消费者问题中,我们可以使用两个信号量:一个用于表示缓冲区中可用的空间数量,另一个用于表示缓冲区中已有的数据数量。生产者线程在生产数据时需要获取空闲空间信号量,并将数据放入缓冲区。消费者线程在消费数据时需要获取已有数据信号量,并从缓冲区中取出数据。 具体而言,生产者线程的伪代码如下: ``` while (true) { // 生产数据 data = produce_data(); // 获取空闲空间信号量 wait(empty_semaphore); // 获取互斥锁 wait(mutex); // 将数据放入缓冲区 insert_data_into_buffer(data); // 释放互斥锁 signal(mutex); // 释放已有数据信号量 signal(full_semaphore); } ``` 消费者线程的伪代码如下: ``` while (true) { // 获取已有数据信号量 wait(full_semaphore); // 获取互斥锁 wait(mutex); // 从缓冲区中取出数据 data = remove_data_from_buffer(); // 释放互斥锁 signal(mutex); // 释放空闲空间信号量 signal(empty_semaphore); // 消费数据 consume_data(data); } ``` 其中,wait() 函数表示等待信号量,如果信号量的值为 0,则线程将被阻塞,直到信号量的值为正数;signal() 函数表示释放信号量,将信号量的值加 1。mutex 表示互斥锁,用于保护共享资源的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值