Linux下用条件变量实现多线程间生产者与消费者问题

一、 线程间的同步还有这样一种情况:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行。在pthread库中通过条件变量(Condition Variable)来阻塞等待某个条件,或者唤醒等待这个条件的线程。Condition Variablepthread_cond_t类型的变量表,可以这样初始化和销毁:

返回值:成功返回0,失败返回错误号。

一个Condition Variable总是和一个Mutex搭配使用的。一个线程可以调用pthread_cond_wait在一个Condition Variable上阻塞等待,这个函数做以下三步操作:

1. 释放Mutex

2. 阻塞等待

3. 当被唤醒时,重新获得Mutex并返回

pthread_cond_timedwait函数还有一个额外的参数可以设定等待超时,如果到达了abstime所指定的时刻仍然没有别的线程来唤醒当前线程,就返回ETIMEDOUT。一个线程可以调用pthread_cond_signal唤醒在某个Condition Variable上等待的另一个线程,也可以调用pthread_cond_broadcast唤醒在这Condition Variable上等待的所有线程。

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

本例中使用带头单链表实现生产者消费者之间的场所,使用尾插头删的功能。如下为只有一个消费者,一个生产者。生产者实现插入节点,消费者实现删除节点。需要条件变量与互斥锁结合使用。

代码如下:

其运行结果如下:

改为多线程:也就是多消费者,多生产者。需要实现,消费者与消费者之间互斥,生产者与生产者之间互斥,消费者与生产者之间互斥。代码如下:

其运行结果如下:

总结:在互斥的基础之上实现了同步,不仅解决了死锁的问题,而且使线程间的通信更加的高效。

时间: 2024-08-05 22:45:00

Linux下用条件变量实现多线程间生产者与消费者问题的相关文章

hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. vi /etc/profile 在profile文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_H

Linux下的环境变量

1,何为环境变量 用户成功登录后,启动shell的过程中,定义一些和用户的工作环境有关的变量 2,查看Linux的环境变量可以使用命令:env 常用的环境变量有以下几个: HOME:用户的家目录的完整路径名. LOGNAME:登录用户名. IFS:命令行内部域分隔符,即白空格. PATH:由冒号分隔的路径名.shell将按PATH变量中给出的顺序搜索这些目录,从中查找要执行的命令.找到的第一个与命令 名称一致的可执行文件将被执行. OLDPWD:刚刚离开的目录. TERM:终端的类型. PWD:

Linux下设置环境变量

setenv(set environment variable) 功能说明:查询或显示环境变量.语 法:setenv [变量名称][变量值]补充说明:setenv为tsch中查询或设置环境变量的指令. 对于bash shell关 于环境变量命令介绍:1.echo 显示某个环境变量值 echo $PATH2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号)3.env 显示所有环境变量4.set 显示本地定义的shell变量5.unset 清除环

linux下java环境变量的设置,形参个数可变的方法

首先我们执行jdk二进制文件: 生成一个jdk目录,将这个目录mv到/usr/loca/jdk # vim /etc/profile export JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PAT# vim Varargs.java #source /etc/profile 例子: #vim test.java 这个例子中test方法形参个数可变,在形参列表中,最后一个形参

14行脚本配置Linux下Java环境变量

对于Java初学者而言,可能在Java开发环境的配置上要花一番功夫,而在Linux下,配置Java的环境变量,这个功夫可能又会增加.为此,我编了一个bash脚本来实现自动配置Java的环境变量.你只需要将如下脚本和你下载的jdk压缩包放到一个文件夹下,执行该脚本,并依据提示输入一些信息即可. config_java.sh #!/bin/bash jdkpath=/usr/lib/java/ sudo mkdir $jdkpath read -p "Please input the name of

conditon_variable(条件变量)用于线程间同步

conditon_variable(条件变量)用于线程间同步 condition_variable有5个函数,函数名及对应的功能如下: wait阻塞自己,等待唤醒 wait_for阻塞自己,等待唤醒,最多等待一段时间 wait_until阻塞自己,等待唤醒,最多等待到某个时间点 notify_one 唤醒一个等待在这个条件变量上的线程 notify_all 唤醒所有等待在这个条件变量上的线程 3个wait函数都要求输入一个已经上锁的unique_lock<mutex>变量,并且都有两个版本,一

linux下配置环境变量方式

linux下配置环境变量有多种方式,下面简述之 方式1.编辑 /etc/profile 文件,增加如下内容 JAVA_HOME=/usr/local/jdk1.8 export JAVA_HOME PATH=$PATH:$JAVA_HOME/bin export PATH 方式2:编辑 /etc/bashrc 文件,方式同上 方式3:在 /etc/profile.d 目录增加文件,例如:jdk.sh,内容同上 方式4:在用户目录/root下修改.bash_profile文件或者修改.bashrc

linux 下PATH环境变量

环境变量简介 什么是环境变量呢?简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件. 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现"command not found"的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了.这涉及到环境变量 PATH 的设置问题. 查看当前系统下有哪些环境变量的方法: echo $PATH 环境变量设置 注意: 添加多个环境变量时,不同的环境变量之间使用冒号分隔开: l

环境变量解释以及在Linux下的环境变量设置

一.环境变量解释 环境变量是什么? 引用百度百科里面的解释:环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还可以到path中指定的路径去找.用户通过设置环境变量,来更好的运行进程. 为什么需要环境变量? windows系统下,假如我们安装了某一款软件,安装结束后,在安装目录会生成一个该软件的.exe文件,双击该文件,我