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).取消 ...
随机推荐
- ieee80211 phy1: Failed to select rate control algorithm
/************************************************************************ * ieee80211 phy1: Failed t ...
- (经典) K&R的名著<<C程序设计语言>>二分查找
#include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid ...
- 排列组合算法(基于c++实现)
排列 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个.现以{1, 2, 3}为例说明如何编写全排列的递归算法 第一层S1表示第一个数分别与第1.2.3个数交换位置,如123 ...
- 判断网络类(获取mac) InternetCheck
using System; using System.Collections.Generic; using System.Net.NetworkInformation; using System.Ru ...
- 02 - Unit07:显示笔记下拉菜单、笔记的分享功能、笔记的删除功能
显示笔记下拉菜单 笔记的分享功能 发送Ajax请求 绑定事件:绑定分享按钮单击事件 参数获取:笔记ID 发送请求:/share/add.do 服务器处理 ShareController ShareSe ...
- 老叶观点:MySQL开发规范之我见(更新版)
转自:http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=207239419&idx=2&sn=bddbe0a657758 ...
- java 面向对象 — 多态
注意:如果用父类引用指向子类对象的时候.不可以调用,子类中有但是父类中没有的方法. 抽象 方法没有具体方法,以分号结束.例:public abstract void call(); 1.接口必须要有a ...
- eclipse 的安装和汉化
第一步:直接百度搜索eclipse,第一个就是官方网站 第二步:点击DOWNLOAD 64BIT进入下载页面 第三步:点击DOWNLOAD进行下载 If the download doesn't st ...
- vue-router和锚点冲突问题
传统的锚点定位会与vue-router中的路由设置存在冲突,都是使用'#'进行的,所以这里使用一直方法来模拟锚点跳转,并使用tween.js达到动态的过度效果 不使用原生锚点,使用这种方式解决 imp ...
- 接口自动化(六)--使用QQ邮箱发送邮件
接口测试执行完发送一个邮件,这里使用QQ邮箱发送,先要拿到QQ邮箱授权码,方法自行百度 # coding=utf-8 import smtplib from email.mime.text impor ...