生产者消费者问题 Linux多线程,生产者—消费者的linux多线程实现.docx

生产者—消费者的 Linux 多线程实现

1 线程基本概念

进程和线程 可执行文件由指令和数据组成。进程就是 在计算机上运行的可执行文件针对特定的输入数据的一个实例, 同一个可执行程序文件如果操作不同的输入数据就是两个不同 的进程。

线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存 器状态, 每个线程共享其所附属的进程的所有的资源, 包括打开 的文件、页表(因此也就共享整个用户态地址空间)、信号标识 及动态分配的内存等等。

Linux 中线程调度是由内核调度程序完成的,每个线程有自 己的 ID 号。与进程相比,它们消耗的系统资源较少、创建较快、 相互间的通信也比较容易。 存在于同一进程中的线程会共享一些 信息。同时作为一个独立的线程, 它们又拥有一些区别于其他线 程的信息,包括线程ID、寄存器集合(如程序计数器和堆栈指 针)、堆栈、错误号、信号掩码以及线程优先权。

线程和进程的关系是: 线程是属于进程的, 线程运行在进程 空间内, 同一进程所产生的线程共享同一物理内存空间, 当进程 退出时该进程所产生的线程都会被强制退出并清除。

线程优点

它是一种非常“节俭”的多任务操作方式。 运行于一个进 程中的多个线程,使用的是同一个地址空间,共享大部分数据, 不需要太多的空间启动一个线程, 而且,线程间彼此切换所需的 时间也比较短。 ②线程间方便的通信机制。 由于同一进程下的线 程之间共享数据空间, 所以一个线程的数据可以直接为其它线程 所用,这不仅快捷,而且方便。③使多 CPU系统更加有效。操作 系统会保证当线程数不大于 CPU数目时,不同的线程运行于不同 的CPU上。④改善程序结构。一个既长又复杂的进程可以考虑 分为多个线程, 成为几个独立或半独立的运行部分, 便于理解和 修改。

2 生产者 - 消费者问题

2.1问题概述 生产/消费者在有界缓冲上操作,它利用N个 字节的共享内存作为有界循环缓冲区, 生产者线程不断顺序地将 0到 1000的数字写入共享的循环缓冲区,同时消费者线程不断 地从共享的循环缓冲区读取数据。 利用写一个数据模拟放一个产 品,利用读一个数据模拟消费一个产品。 当缓冲区空时消费者应 阻塞睡眠, 而当缓冲区满时生产者应当阻塞睡眠。 一旦缓冲区中 有空单元, 生产者线程就向空单元中写入数据。 一旦缓冲区中有 未读过的数据,消费者线程就从该单元中读出数据。

算法分析 生产者线程向循环缓冲区中写入数据,消费 者线程从缓冲区中读取数据, 生产者线程向缓冲区中写入数据时 消费者线程不能访问缓冲区, 消费者线程从缓冲区中读取数据时 生产者线程也不能访问缓冲区, 既读的时候不能写, 写的时候不 能读,得保证缓冲区这一临界资源同一时间只能被一个线程访 问;缓冲区满的时候不能生产,空的时候不能消费。

2.2.1 主程序:初始化结构体 prodcons 中的各个参数;建 立生产者、消费者线程;等待线程结束。

222生产者线程:①设初始写入的数据 N为0;判断N小 于1000是否成立;如果不成立,循环缓冲区插入OVER如果成

立,向循环缓冲区生产既写入 N并打印;重复该过程直到N=1000 为止。②生产产品的函数 put :获得互斥锁;判断循环缓冲池是 否满,如果满将生产者线程阻塞到满的条件变量 b->notfull 上, 并将互斥锁释放,让消费者线程读取数据。如果不满,向缓冲中 写入数据;如果有线程阻塞到环境变量 b->empty ,将该线程唤 醒,同时释放互斥锁。如果没有线程阻塞到条件变量 b->empty 上,就直接释放互斥锁。

2.2.3 消费者线程: ①从循环缓冲区中消费既读取数据并打 印;判断读取的数据是否是结束标志 over ,如果是退出。如果 不是,重复该过程,直到读到的数据是结束标志 over 。②消费 产品的函数 get :获得互斥锁;判断循环缓冲池是否空,如果空 将生产者线程阻塞到空的条件变量 b->empty 上,并将互斥锁释 放,让生产者线程写数据。如果不空,从缓冲中读取数据;如果 有线程阻塞到环境变量 b->notfull 上,将该线程唤醒,同时释 放互斥锁。如果没有线程阻塞到条件变量 b->notfull 上,就直 接释放互斥锁。

数据结构

struct prodcons {

int buffer[BUFFER_SIZE] ; /* the actual data */ pthread_mutex_t lock ; /* mutex ensuring exclusive access to buffer */

int readpos , writepos ; /* positions for reading and writing */ pthread_cond_t notempty ; /* si

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值