Linux 开发之线程条件锁那些事
条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发。一个常用的例子就是在线程中无限循环执行一个操作,但是这个操作并不是需要 一直执行而是在满足一定条件下执行。例如:
int changed = 0;
static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;
void* thread_fun(void* argc)
{
while(true)
{
if(changed)
{
printf("i am changed");
}else
{
//方法一
sleep(1);
//方法二
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cond,&mtx);
pthread_mutex_unloc(&mtx);
}
}
}
void main()
{
pthread_t threadId;
pthread_create(&threadId,NULL,thread_fun,NULL);
sleep(10);
changed = 1;
//方法二
pthread_cond_signal(&cond);
}
从上面的例子可以看出当changed变量为1的时候才执行操作,其他时间不执行,如果使用sleep函数,那么将会出现执行不及时的现象,如果使用条件锁的话那么会在条件改变的时候立即执行,效果比较好。
那如果使用条件锁呢?
首先是条件锁的创建,条件锁创建有两种方法,一种是静态方法,既使用静态变量的方式:
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;
另外一种是动态的方法:
pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);
其次是等待: pthread_cond_wait,此方法可以加超时的时间,如果没有超时的时间则是一直等待。
再次是触发:当达到条件之后使用 pthread_cond_signal通知
但是在多线程里面必须要配合互斥锁,因为在多线程的条件下如果不使用互斥锁,那么就有可能同时多个执行ptread_cond_wait会造成混乱。
转载于:https://my.oschina.net/u/1013544/blog/1788088
最新文章
- iOS----- Crash 分析(文三)- 符号化崩溃日志
- [SharePoint] SharePoint 错误集 1
- PHP基础之 数组(二)
- python-haproxy作业讲解视频总结
- C# DEBUG 调试信息打印及输出详解
- bochs安装一系列问题
- spring整合freemarker 自定义标签
- Sublime 3114 + 转换GBK方法
- .NET中的 枚举
- iOS 导航控制器如何随意push和pop 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A
- HTTP缓存机制梳理
- css之float
- Linux流量监控工具使用总结 - iftop
- swith 语句详解
- RobotFramework 数据分离
- LR多分类推广 - Softmax回归*
- 关于mongodb按照字段模糊查询方法
- css---遮罩层
- linux配制DNS服务器基本能功能
- MATLAB中eig的作用
热门文章
- Python循环语句,对象
- 单芯片DP108USB声卡/音频解决方案完全替代CM108/CM108AH
- 微信小程序mpvue-动态改变navigationBarTitleText值
- Flask 入门(十三)
- "浮动按钮"组件:<;fab>; —— 快应用组件库H-UI
- NumPy学习1:基本概念
- Flutter 吐血整理组件继承关系图
- excel中存储的时间的类型是什么
- shell执行${var:m:n}报错Bad substitution解决办法
- Kubectl patch命令使用