博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POSIX条件变量pthread_cond
阅读量:4933 次
发布时间:2019-06-11

本文共 1615 字,大约阅读时间需要 5 分钟。

1.什么是条件变量

  条件变量是维持线程同步的一种手段,当条件不满足时,线程会被自动阻塞,直到条件被触发为止。

  条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包含两个动作:1.一个或多个线程等待条件变量满足而被挂起;2.一个线程使条件成立(发出条件成立信号唤醒被阻塞的一个或多个线程)。

2.条件变量通常与互斥锁配合使用,为什么?互斥锁保护的是什么?

先来看一个条件变量的使用场景:

等待条件变量函数原型:

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
void *func(void *arg){    pthread_mutex_lock(&mutex);    while(cond_is_false) //条件不满足,wait    {        pthread_cond_wait(&cond, &mutex);    }    //...    pthread_mutex_unlock(&mutex);    return (void *)0;}

mutex保护的是什么?

  不是条件变量本身cond,而是确定条件变量是否成立的线程间共享的全局变量,当mutex被lock后,可以放心的去判断全局变量,而不用担心在这期间被其他线程改变其状态。当条件不满足时,该线程首先unlock了mutex,线程被挂起(以上两步操作在pthread_cond_wait中完成,两步操作一块完成(保证原子性)),当mutex被unlock后,其他线程就有机会修改全局变量使条件变量满足,从而发送条件成立信号,调用pthread_cond_signal,唤醒在pthread_cond_wait中仍在被阻塞的线程,使其从pthread_cond_wait中返回,在返回前需要再次lock mutex。

pthread_cond_wait的工作流程可总结为:

  1.unlock mutex;

  2.waiting;

  3.条件满足时lock mutex返回。1和2在一起完成时原子性的。

3.为什么使用while而不是if?

  1. 因为pthread_cond_wait函数返回并不意味着一定是条件满足(被其他线程的pthread_cond_signal唤醒),而有可能是意外返回。
  2. 【个人理解,不一定正确】在某线程A发送条件满足信号调用pthread_cond_signal、unlock mutex后,到从waiting中唤醒的线程B lock mutex之间,可能会有其他线程C先一步lock mutex而导致条件变量不满足。因此等到被唤醒的线程B lock mutex后需再次判断条件是否真的满足。

4.为什么unlock与wait操作要在原子操作内进行?

  如果不是原子操作,先unlock mutex,再wait(在wait时条件成立可被唤醒)。如果发生以下情况:在unlock之后,wait之前,有其他线程获取到mutex,使条件变量满足,并发出signal,而原线程因为还没wait而错过这个信号。

5.条件变量使用规范

等待条件:

pthread_mutex_lock(&mutex);while(条件为假){    pthread_cond_wait(&cond, &mutex);}修改条件pthread_mutex_unlock(&mutex);

条件满足时唤醒:

pthread_mutex_lock(&mutex);设置条件为真pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);

 

参考:

转载于:https://www.cnblogs.com/dabai56/p/11107087.html

你可能感兴趣的文章
T3 光
查看>>
搭建交叉调试环境 arm-linux-gdb配合gdbserver
查看>>
使用Jsoup 抓取页面的数据
查看>>
使用命令批量对文件中出现的字符串进行替换
查看>>
C#获取URL参数值
查看>>
Struts 框架 之 文件上传下载案例
查看>>
【重走Android之路】【路线篇(二)】知识点归纳
查看>>
graphviz入门
查看>>
tomcat 系统架构与设计模式 第二部分 设计模式 转
查看>>
scanf中的%[^\n]%*c格式
查看>>
启动Eclipse报Initializing Java Tooling错误解决方法
查看>>
用jquery来实现类似“网易新闻”横向标题滑动的移动端页面
查看>>
(原)基于物品的协同过滤ItemCF的mapreduce实现
查看>>
CSS可以和不可以继承的属性
查看>>
eclipse每次当我按ctrl+鼠标点击代码,自动关闭,产生原因及解决办法!!
查看>>
hbase
查看>>
用PHP将Unicode 转化为UTF-8
查看>>
HDOJ1002 A+B Problem II
查看>>
ADB server didn't ACK(adb不能开启
查看>>
网页内容抓取
查看>>