1. 首先pthread_cond_wait 的定义是这样的

The pthread_cond_wait() and pthread_cond_timedwait() functions are used to block on a condition variable. They are called with mutex locked by the calling thread or undefined behaviour will result.

These functions atomically release mutex and cause the calling thread to block on the condition variablecond; atomically here means "atomically with respect to access by another thread to the mutex and then the condition variable". That is, if another thread is able to acquire the mutex after the about-to-block thread has released it, then a subsequent call to pthread_cond_signal() or pthread_cond_broadcast() in that thread behaves as if it were issued after the about-to-block thread has blocked.

2. 由上解释可以看出,pthread_cond_wait() 必须与pthread_mutex 配套使用。

pthread_cond_wait()函数一进入wait状态就会自动release mutex.

In Thread1:

pthread_mutex_lock(&m_mutex);   
pthread_cond_wait(&m_cond,&m_mutex);   
pthread_mutex_unlock(&m_mutex);

In Thread2:

pthread_mutex_lock(&m_mutex);   
pthread_cond_signal(&m_cond);   
pthread_mutex_unlock(&m_mutex);

为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 进入wait_cond状态 并自动释放mutex) 的时候才能调用cond_singal.

3.

pthread_cond_wait() 一旦wait成功获得cond 条件的时候会自动 lock mutex.

这就会出现另一个问题。这是因为

The pthread_cond_wait() and pthread_cond_timedwait()  is a cancellation point.

In Thread3:

pthread_cancel(&m_thread);

pthread_join();

因为pthread_cond_wait() and pthread_cond_timedwait()  是线程退出点函数,因此在Thread3中

可以调用pthread_cancel()来退出线程1。那样显然线程1会在pthread_cond_wait(&m_cond,&m_mutex);   和 pthread_mutex_unlock(&m_mutex); 之间退出,    pthread_cond_wait() 函数返回后自动lock住了mutex, 这个时候线程1退出(并没有运行到pthread_mutex_unlock()),如果Thread2这个时候就再也得不到lock状态了。

通常解决这个问题的办法如下

void cleanup(void *arg)
{
  pthread_mutex_unlock(&mutex);
}
void* thread1(void* arg)
{
  pthread_cleanup_push(cleanup, NULL);  // thread cleanup handler
  pthread_mutex_lock(&mutex);
  pthread_cond_wait(&cond, &mutex);
  pthread_mutex_unlock(&mutex);
  pthread_cleanup_pop(0);
}

pthread_cond_wait() 函数的使用相关推荐

  1. 对pthread_cond_wait()函数的理解

    对pthread_cond_wait()函数的理解(我在CU上回复一个人的问题的解答) (个人见解,如有错误,恳请大家指出) /************pthread_cond_wait()的使用方法 ...

  2. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...

  3. pthread_cond_wait()函数的详解

    http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线 ...

  4. Linux 条件变量使用细节(为何调用 pthread_cond_wait 前加锁,函数内部解锁,返回时又加锁)

    一.本文目的 首先说明,本文重点不在怎么用条件变量.这里我先列出 apue 中对于pthread_cond_wait函数的这么一段话: 调用者把锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件 ...

  5. pthread_cond_wait和pthread_cond_signal函数详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/YEYUANGEN/article/de ...

  6. 多线程:pthread_cond_wait 实现原理

    函数原型 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 第一个参数为需要等待的条件,第二个参数为互斥锁 一般该 ...

  7. 条件变量pthread_cond_wait()和pthread_cond_signal()详解

    条件变量          条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立&qu ...

  8. pthread_cond_wait()加一个while为什么的解释

    等号上面这段是大多数网上给pthread_cond_wait()加一个while为什么的解释:但是有些地方不太明白或者说没有解释清晰: 准备:1:pthread_cond_singal是唤醒至少一个线 ...

  9. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...

最新文章

  1. [异常笔记] spring cloud 服务消费者启动-2018040501
  2. https://www.threatminer.org/domain.php?q=blackschickens.xyz ——域名的信誉查询站点 还可以查IP...
  3. 2017年 JavaScript 框架回顾 -- 前端框架
  4. 适用于python机器学习与实践的twenty_newsgroups.py文件内容
  5. HashMap如何在Java中工作
  6. hdu 4055 hdu 4489 动态规划
  7. 【推荐实践】因果推断在阿里文娱用户增长中的应用
  8. Bug(七)—— error LNK2019:无法解析的外部符号
  9. python 堆栈_Python堆栈
  10. 如何在cad中模块计算机,cad中家具模板哪里找(怎么在CAD图纸里面加入家具)
  11. python语言是胶水语言吗_为什么只有python是胶水语言?
  12. 计算机应用基础试题答案截图,《计算机应用基础》试题二
  13. 运放输入偏置电流方向_测试运算放大器的输入偏置电流
  14. 输出一个菱形(C语言)
  15. C语言用函数max求两个数的最大值
  16. python祝福,1024,用Python抽取你的专属祝福!
  17. Android与bmob的有机结合
  18. 《九日集训》第四天打卡
  19. 剪辑视频怎么加音效 视频音效常用都有哪些类型
  20. mask-image实现聚光灯效果

热门文章

  1. 在GDI+中用Mattix类对2D矢量图形进行平移、缩放操作
  2. 10年Python大牛倾力打造系统Python学习流程图!
  3. 零点起飞学mysql视频_零点起飞学MySQL
  4. directx 双缓冲 运动 闪烁_24期0利率 | BMW超值福袋开启“双11”购车狂欢节!!
  5. lora和nbiot的相同点,它们之间有何区别和联系?
  6. 如何用matlab读取npz文件,Python Numpy中数据的常用的保存与读取方法
  7. 【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)
  8. appium java类库下载,appium 简明教程 (4)——appium client 的安装
  9. pytorch dropout_手把手带你使用字符级RNN生成名字 | PyTorch
  10. html5圆形图片轮播,jQuery超酷响应式圆形图片轮播图特效