Condition Variable使用及其Thread Cancellation线程取消
条件变量Condition Variable的一般用法:
唤醒用法:
struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
//whatever variables maintain the condition
) var = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, ... };//声明结构体并初始化
pthread_mutex_lock(&var.mutex);
//set condition true
pthread_cond_signal(&var.cond):
pthread_mutex_unlock(&var.mutex);
等待用法:
pthread_mutex_lock(&var.mutex);
while (/*condition is false*/)
pthread_cond_wait(&var.cond, &var.mutex);
//modify condition
pthread_mutex_unlock(&var.mutex);
避免锁冲突:
有一种情况是,唤醒线程中调用pthread_cond_signal之后,假如立即调度等待线程。那么等待线程立即运行然后停止,因为它不能获取到锁。为了不影响等待线程及时获取锁,唤醒线程另一种写法是:
int dosignal;
pthread_mutex_lock(&nready.mutex);
dosignal = (nready.nready == );
nready.nready++;
pthread_mutex_unlock(&nready.mutex); //先释放锁,然后唤醒等待线程
if (dosignal)
pthread_cond_signal(&nready.cond);
即,先释放锁,然后唤醒。这样就避免了等待线程请求锁的冲突问题。而调用pthread_cond_wait之前必须加锁。
条件变量的线程取消(Thread Cancellation)问题:
在使用条件变量进行等待时,注意线程被取消时的锁释放问题。为了让线程退出时释放所持有的锁,可以设置pthread_cleanup_push清理函数,参数是清理函数及其参数,这些清理函数在线程被取消时或正常退出时(不管是pthread_exit还是从线程执行函数返回)都会被执行。使用pthread_cleanup_pop弹出清理函数栈顶的函数,参数非0表示执行,0表示不执行。
程序正常执行时,条件变量的wait函数正常返回,所以,pthread_cleanup_pop(0)表示,取消函数不会被执行;当程序在wait中被取消时,程序不会从wait函数返回,而是重新获取条件变量关联的锁之后,直接退出,但是退出之前调用清理函数。
一般用法:
pthread_mutex_lock(&var.mutex); while (/*condition is false*/)
{
pthread_cleanup_push(/*cancel_handler*/,/*arg*/);
//pthread_cond_wait是取消点,被取消时,函数不会返回,但是会重新获取条件变量关联的锁,即var.mutex。因为该函数内部实现机制就是先释放锁然后等待,等待结束再原子操作重新获取锁。
pthread_cond_wait(&var.cond, &var.mutex);
pthread_cleanup_pop();
}
9 //modify condition
pthread_mutex_unlock(&var.mutex);
在清理函数中如cancel_handler,释放条件变量关联的锁即可。
void cancel_handler(void *arg)
{
var = arg;
//该函数将相关对象恢复至被cancel之前的状态 //其他操作
pthread_mutex_unlock(&var.mutex);
}
Condition Variable使用及其Thread Cancellation线程取消的更多相关文章
- .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...
- .NET异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...
- 关于condition variable的理解
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- 线程取消 (pthread_cancel)
线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(C ...
- 关于Condition Variable的一些思考
可能大家都使用过condition variable(之后称cv),一些博客也对cv做了介绍,但是有的说的不完全正确,甚至有误导使用者的倾向,其实最合理的使用方式是查阅文档, 如果你英语还ok的话,h ...
- POSIX 线程取消点的 Linux 实现
http://blog.csdn.net/stevenliyong/article/details/4364039 原文链接:http://blog.solrex.cn/articles/linux- ...
- c++并发编程之条件变量(Condition Variable)
条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...
- C++11中的mutex, lock,condition variable实现分析
本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...
- Linux 线程取消(pthread_cancel)
基本概念 pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消 ...
随机推荐
- np.ones(N)/N的作用
在python中导入numpy包 N=5 weights = np.ones(N)/N //这里就相当于创建了一个数组,且为5个1/5的数组 print "weights&quo ...
- 谷歌浏览器怎么调试js 谷歌浏览器调试javascript教程
谷歌浏览器是一款由谷歌公司开发的浏览器.谷歌浏览器是一款基于其他开源软件所撰写的.下面小编为大家分享一篇谷歌浏览器调试javascript的教程,希望帮助大家 首先我们打开开发者工具,你可以直接在页面 ...
- 20145237《网络攻防》Web基础
基础问题回答 什么是表单: 表单是一个包含表单元素的区域.表单元素是允许用户在表单中输入信息的元素.表单在网页中主要负责数据采集功能. 浏览器可以解析运行什么语言: 超文本标记语言:HTML: 可扩展 ...
- [BZOJ5330][SDOI2018]反回文串
luogu bzoj sol 枚举一个长度为\(n\)为回文串,它的所有循环位移都可以产生贡献. 但是这样算重了.重复的地方在于可能多个回文串循环同构,或者可能有的回文串经过小于\(n\)次循环位移后 ...
- WinForm 每用户只允许创建一个实例
string mutexName = System.Environment.UserName + "nono"; bool runone; System.Threading.Mut ...
- VC6 快捷键
F1: 帮助 Alt+F8 : 自动缩进Ctrl+O :OpenCtrl+P :PrintCtrl+N :NewCtrl+Shift+F2 :清除所有书签F2 :上一个书签Shi ...
- Boost C++ 库 中文教程(全)
Boost C++ 库 目录 第 1 章 简介 第 2 章 智能指针 第 3 章 函数对象 第 4 章 事件处理 第 5 章 字符串处理 第 6 章 多线程 第 7 章 异步输入输出 第 8 章 进程 ...
- Raspberry Pi 安装FTP(Pure-FTP)
Raspbian版本: 安装: 因为使用的是默认的pi用户,所以下面的命令都带着sudo. 安装Pure-FTP sudo apt-get install pure-ftpd 2. 创建用户组ftpg ...
- 使用sqoop从Oracle或mysql抽取数据到HDFS遇到的报错及解决
一.参考文档: 1.https://www.rittmanmead.com/blog/2014/03/using-sqoop-for-loading-oracle-data-into-hadoop-o ...
- 史上最全的Angular.js 的学习资源
Angular.js 的一些学习资源 基础 官方: http://docs.angularjs.org angularjs官方网站已被墙,可看 http://www.ngnice.com/: 官方zi ...