多线程条件变量(pthread_cond_wait)用法

条件变量是利用线程间共享得全局变量进行同步的一种机制,主要包括两个动作:一个线程等待“条件变量的条件成立”而挂起;另一个线程使“条件成立”给出条件成立信号。为了防止竞争,条件变量得使用总是和一个互斥锁结合在一起。

1、创建和注销

条件变量和互斥锁一样,有两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER,动态方式使用pthread_coud_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)函数,cond_attr设置为NULL即可。注销需要使用int pthread_cond_destroy(pthread_cond_t *cond);

2、等待和激发

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)

timewait方式表示超过时间条件没有满足则返回ETIMEOUT,结束等待 ,这个time是以绝对时间形式出现,即0表示格林尼治时间1970年1月1日0时0分0秒。为了防止多个线程同时请求pthread_cond_wait(),需要用互斥锁(mutex)来限定phread_cond_wait()的操作。对cond的操作必须是互斥的。下面是配合pthread_cleanup_push(),pthread_cleanup_pop()的一个示例程序:

#include "pthread.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"struct _Node
{int number;struct _Node *next;
};
typedef struct _Node Node;Node *head;/*信号量和条件变量*/
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*线程异常时处理函数*/
static void cleanup_handler(void *arg)
{printf("cleanup_handler\n");free(arg);(void)pthread_mutex_unlock(&mtx);
}/*
pthread_cleanup_push注册一个回调函数,如果你的线程在对应的pthread_cleanup_pop之前异常退出(return是正常退出,其他是异常),那么系统就会执行这个回调函数(回调函数要做什么你自己决定)。但是如果在pthread_cleanup_pop之前没有异常退出,pthread_cleanup_pop就把对应的回调函数取消了
*/
static void* thread_func(void *arg)
{Node *p = NULL;printf("in thread_func()\n");/*注册线程异常处理函数*/pthread_cleanup_push(cleanup_handler, p);while (1){pthread_mutex_lock(&mtx);while (NULL != head){/*如果条件不满足,则挂起*/pthread_cond_wait(&cond, &mtx);p = head;printf("Got %d from front of queue\n",p->number);free(p);pthread_mutex_unlock(&mtx);}}/*清空线程异常处理函数*/pthread_cleanup_pop(0);return 0;
}int main()
{pthread_t tid;int i;Node *p;pthread_create(&tid, NULL, thread_func, NULL);for(i = 0; i < 10; i++){printf("int main():%d", i);p = (Node*)malloc(sizeof(Node));p->number = i;pthread_mutex_lock(&mtx);p->next = head;head = p;/*通知条件OK了*/pthread_cond_signal(&cond);pthread_mutex_unlock(&mtx);sleep(1);}printf("thread 1 wanna end then cancel thread2.\n");pthread_cancel(tid);pthread_join(tid, NULL);printf("All done\n");return 0;
}

 输出结果如下:

int main():0in thread_func()
int main():1Got 1 from front of queue
int main():2Got 2 from front of queue
int main():3Got 3 from front of queue
int main():4Got 4 from front of queue
int main():5Got 5 from front of queue
int main():6Got 6 from front of queue
int main():7Got 7 from front of queue
int main():8Got 8 from front of queue
int main():9Got 9 from front of queue
thread 1 wanna end then cancel thread2.
cleanup_handler
All done

 

转载于:https://www.cnblogs.com/binmaizhai/archive/2013/03/21/2973554.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 文件系统规划_Mysql的文件系统规划以及日志配置

Mysql服务器文件系统规划:/dev/sda1 /boot/dev/sda2 //dev/sda3 /home/dev/sda4 /tmp/dev/sdb1 /data/dev/sdc1 /logsda:系统目录 sdb:数据目录 sdc:日志目录linux调度策略&#xff1a;--查看当前的调度策略:less /sys/block/sdb/queue/scheduler[noop] anticipatory deadli…

设备驱动框架4——将驱动集成到内核中

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 驱动集成到内核的概念 驱动开发的步骤一般是&#xff1a; &#xff08;1&#xff09;以模块的形式在内核外部编写与调试 &#xff08;2&#xff09;将调试好的驱动代码集成到kernel中 之前我们编写的…

VirtualBox 虚拟机的网络设置

http://cnzhx.net/blog/virtualbox-vm-network-setting/ 注意&#xff1a;修改第一个网卡虚拟机&#xff0c;此处网络设置添加的是第二个网卡虚拟机&#xff1f;&#xff1f;转载于:https://www.cnblogs.com/ztinass/p/3771225.html

[ios]UITableViewCell自适应高度 【转】

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 列寬 CGFloat contentWidth self.tableView.frame.size.width; // 用何種字體進行顯示 UIFont *font [UIFont systemFontOfSize:13]; // 該…

MYSQL存储磁盘创建vgcreate_【转】parted创建硬盘分区并创建LVM

目的&#xff1a;将两个三T的硬盘做成LVM(sdc,sdd)一、parted将硬盘进行分区&#xff1a;1)parted的命令方式Parted 命令分为两种模式&#xff1a;命令行模式和交互模式。1、命令行模式&#xff1a; parted [option] device [command] ,该模式可以直接在命令行下对磁盘进行分区…

Linux设备驱动模型1——设备驱动模型的简介与底层架构

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、linux设备驱动模型简介 1、设备驱动模型的含义 设备驱动模型主要体现为以下四个方面&#xff1a; &#xff08;1&#xff09;类class、总线bus、设备device、驱动driver 这四个概念分别对应着四…

例子简单说说C# ref和out

首写从这字段看 ref 就是引用的意思 out当然就是输出了public void getRefStr(ref string str) {str"hello 你好&#xff0c;你变成了Ref了" }public void getOutStr(out string outStr){outStr "hello 你好&#xff0c;你是out输出的值";} protected…

VARIANT变体类型数据

2019独角兽企业重金招聘Python工程师标准>>> 特殊 Variant 是一种特殊的数据类型&#xff0c;除了定长String数据及用户定义类型外&#xff0c;可以包含任何种类的数据。Variant 也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函数或TypeName函数来…

mysql修改校对集_MySQL 图文详细教程之校对集问题

软件安装&#xff1a;装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集&#xff0c;是一种功能齐全的数据库语言。在使用它时&#xff0c;只需要发出“做什么”的命令&#xff0c;“怎么做”是不用使用者考虑的。SQL功…

Linux设备驱动模型2——总线式设备驱动组织方式(总线、设备、驱动、类等结构体)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考 Linux总线设备驱动模型的理解 struct class 和 struct class_device 前言 这里说的“总线式”&#xff0c;包括I2C总线等具体物理总线&#xff0c;以及平台总线这个虚拟总线。 rootubuntu:/sy…

C# winform 魔兽MH全图制作教程(1): 开发准备工作

C# winform 魔兽MH全图制作教程&#xff08;1&#xff09;: 开发准备工作 一、开发条件&#xff1a; Visual Studio 2008win xp,win 7,win 2003.C# 语言基础会调试能够运行游戏&#xff1a;《魔兽争霸3冰封王座》拥有版本魔兽客户端版本切换器1.20E,1.24E,1.24D二、设计思路&am…

从常识看中国经济社会-再续之续:套利

2019独角兽企业重金招聘Python工程师标准>>> 《全球化掠夺》提及财富流转的路径&#xff0c;世界仍旧是个丛林&#xff0c;每个人、每个族群都在争夺自己的利益。在一个经济体的内部&#xff0c;财富是垂直流动的&#xff1b;在全球化的经济体中&#xff0c;财富是纵…

python 面向对象编程简称_Python基础-面向对象编程

简介三中编程范式面向过程编程函数式编程面向对象编程面向对象和面向过程对比面向过程优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发&#x…

Linux设备驱动模型3——平台总线的工作原理

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、平台总线的简介 1、平台总线的简介 &#xff08;1&#xff09;平台总线属于总线中的一种&#xff0c;相对于usb、pci、i2c等物理总线来说&#xff0c;平台总线是虚拟的、抽象出来的。 &#xff…

MYSQL中的BlackHole引擎

MYSQL中的BlackHole引擎 http://blog.csdn.net/ylspirit/article/details/7234021 http://blog.chinaunix.net/uid-22646981-id-3271711.html MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样&#xff1a;任何写入到此引擎的数据均会被丢弃掉&#xff0c;…

mysql备份到带库_RMAN备份恢复——备份到带库的性能

简单测试了一下rac环境通过RMAN备份到带库的功能。数据库&#xff1a;Oracle 10203 RAC for Solaris8带库&#xff1a;Quantum PX502备份软件&#xff1a;Veritas netbackup 6.0由于带库是502&#xff0c;因此包含两个控制器。也就是说&#xff0c;应该可以通过两个控制性并行写…

《DIY四轴飞行器》读书笔记1

内容整理于黄和悦的《DIY四轴飞行器》。 一、四轴飞行器概述 1、四轴飞行器的现状 &#xff08;1&#xff09;研究内容 多级协作&#xff0c;自主飞行倾斜&#xff1b;最优控制理论&#xff0c;飞行器自主飞行和避障&#xff1b;主要是飞控部分。 &#xff08;2&#xff09…

脚本输出当前 “yyyy-MM-dd WeakDay Festval”

ylbtech-JavaScript: 脚本输出当前 “yyyy-MM-dd WeakDay Festval”脚本输出当前 “yyyy-MM-dd WeakDay Festval” 1.A,源代码(Source Code)-脚本输出当前 “yyyy-MM-dd WeakDay Festval”返回顶部 <SCRIPT languagejavascript> <!--calendar new Date();day cal…

SecureCRT密钥远程登录Linux

一&#xff1a;环境SecureCRT版本&#xff1a;SecureCRT_5.1.3linux版本&#xff1a;[rootangelT ~]# cat /etc/redhat-release CentOS release 6.4 (Final)[rootangelT ~]# uname -r2.6.32-358.el6.x86_64linux系统的sshd_config配置文件是默认的&#xff0c;没有任何的修改。…

源码安装mysql数据库_Linux下源码安装mysql数据库

1、 创建mysql安装目录&#xff1a;[rootlocalhost ~]#mkdir –pv /usr/local/mysql/2、 创建数据存放目录&#xff1a;[rootlocalhost ~]#mkdir –pv /data/mysql/3、 创建用户和用户组&#xff0c;并赋予数据存放目录权限&#xff1a;[rootlocalhost ~]#groupadd mysql[ro…