Linux下用环形buf以及POSIX版本信号量解决生产者消费者问题

一、Semaphore(信号量)

Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源, 加锁时获得该资源,将Mutex减到0,表示不再有可用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可用资源。

信号量(Semaphore)和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1。

即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同!

本次使用的是POSIX semaphore库函数,这种信号量不仅可以于同一进程的线程间同步,也可以用于不同进程间的同步。

使用如下:

semaphore变量的类型为sem_t,sem_init()初始化一个semaphore变量,value参数表示可用资源的数量,pshared参数为0表示信号量适用于同一进程的线程间同步。在使用完完semaphore变量之后应该调用sem_destroy()释放与semaphore相关的资源。

调用sem_wait()可以获得资源(P操作),使semaphore的值减1,如果调用sem_wait()时semaphore的值已 经是0,则挂起等待。如果不希望挂起等待,可以调用sem_trywait() 。调sem_post() 可以释放资源(V操作),使semaphore 的值加1,同时唤醒挂起等待的线程。

二、实现生产者--消费者问题

(1).本例中主要使用环形buf与信号量来实现单消费者,单生产者,其环形buf的实现主要用数组下标模环形buf的大小20。

对于生产者而言:不能在生产速度上把消费者套圈。

对于消费者而言:其消费速度不能超过生产者。

本例中主要实现:当生产者所需空格数为0,便挂起等待消费者消费 。当消费者消费数据为0,便挂起等待生产者生产。其生产者空格初始值为20,其消费者数据初始值为0。代码如下:

运行结果:

(2).多生产者,多消费者,修改代码如下,需要分别对生产者,消费者加锁。

运行结果如下:

总结:对于多生产者多消费者,要在其信号量操作内加锁,而不在外部,因为信号量的操作是原子的。并且效率更高。

信号量不是加锁,主要是用来同步的。但是也可以用信号量操作实现加锁。

时间: 2024-10-22 23:20:45

Linux下用环形buf以及POSIX版本信号量解决生产者消费者问题的相关文章

基于POSIX的信号量的生产者消费者模型

信号量和Mutex类似,表示可用资源的数量,和Mutex不同的是,这个数量可以大于1,即如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同. 下面我们看看POSIX semaphore库函数,它既可以用于同一进程的线程间同步,也可以用于不同进程间的同步. 1. int sem_init(sem_t *sem,int pshared,unsigned int value) 我们可以用此函数来创建一个未命名的信号量,pshared参数表明是否在多个进程中使用信号量,如果是,将其设置为非0 值,

Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond

Linux下怎么查看当前系统的版本

Linux下怎么查看当前系统的版本: uname -r 功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][--version] 补充说明:uname可显示linux主机所用的操作系统的版本.硬件的名称等基本信息. 参 数: -a或–all     详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称 -m或–machine   显示主机的硬件(CPU)名 -n或-node

linux下安装Oracle时交换空间不足的解决方法

摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区,空间大小要事先规划好,启动系统时自动进行mount. 这种方法只能在安装OS时设定,一旦设定好不容易改变,除非重装系统. 2.使用swapfile:(或者是整个空闲分区) 新建临时swap

Linux下Tomcat向MySQL插入数据中文乱码解决办法

Linux下Tomcat向MySQL插入数据中文乱码解决办法 一.问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 二.解决办法 1.尝试一直接在linux上面使用insert语句插入中文,正常2.尝试二在tomcat配置文件server.xml中加入useBodyEncodingForURI="true",不行3.尝试三在tomcat配置文件server.xml中再加入URIEncodin

linux下出现undefined reference to mysql init' 的解决方法

查看mysql配置的命令叫:mysql_config -L/usr/lib64/mysql -lmysqlclient \ 1.命令行后加入 -lmysqlclient 附有一个查看mysql配置的命令叫:mysql_config 再分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net linux下出现undefined reference to mysql init' 的解决方法 原

linux下修改mysql数据库编码后无法启动解决办法

linux下老版本的Mysql修改数据库编码的方法是 修改my.cnf vi /etc/my.cnf 在[client]下添加 default-character-set=utf8 在[mysqld]下添加 default-character-set=utf8 在新的版本中如果这样修改的话,会造成无法启动的错误,结果方法是 在[mysqld]下把default-character-set=utf8换成 重启mysql可以使用 sudo /etc/init.d/mysql restart 注意修改

Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post 有名信号量 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <semaphore.h> sem_t *sem_open(co

linux下,matplotlib遇到的相关问题以及解决方法

1.在linux下运行matplotlib程序时,matplotlib的安装. 根据不同的linux系统继续相关安装: Debian / Ubuntu : sudo apt-get install python-matplotlib Fedora / Redhat : sudo yum install python-matplotlib 2.运行matplotlib程序时报如下错误: 解决方案,在文件头加入如下代码 import matplotlib matplotlib.use('Agg')