为什么pthread_cond_wait需要传递mutex参数

news/2024/5/19 5:31:31 标签: pthread, mutex
这是来自知乎的一个问题,由@ 吴志强提出,有意思的是,他看了大家的回答后,突然顿悟了,同时也发现有人答错了,于是乎,他自己回答了自己的问题。我看完后,发现他分析的很精彩,于是就记录在这。下面是他的自答:
-----------------------------------------------------------------------------
看了之后,我获得了启发,突然觉得这或许是跟条件变量的通常用法有关。

首先需要明白两点:
  • wait()操作通常伴随着条件检测,如:
    while(pass == 0)
        pthread_cond_wait(...);
  • signal*()函数通常伴随着条件改变,如:
    pass = 1;pthread_cond_signal(...)

由于此两处都涉及到变量pass,所以为了防止Race Condition,必须得加锁。所以代码会变成下面这样:
// 条件测试
    pthread_mutex_lock(mtx);while(pass == 0)
    pthread_cond_wait(...);pthread_mutex_unlock(mtx);

// 条件发生修改,对应的signal代码pthread_mutex_lock(mtx);pass = 1;pthread_mutex_unlock(mtx);pthread_cond_signal(...);

然后,我们假设wait()操作不会自动释放、获取锁,那么代码会变成这样:
// 条件测试
    pthread_mutex_lock(mtx);while(pass == 0) {
    pthread_mutex_unlock(mtx);
    pthread_cond_just_wait(cv);
    pthread_mutex_lock(mtx);}pthread_mutex_unlock(mtx);

// 条件发生修改,对应的signal代码pthread_mutex_lock(mtx);pass = 1;pthread_mutex_unlock(mtx);pthread_cond_signal(cv);

久而久之,程序员发现unlock, just_wait, lock这三个操作始终得在一起。于是就提供了一个pthread_cond_wait()函数来同时完成这三个函数。

另外一个证据是,signal()函数是不需要传递mutex参数的,所以关于mutex参数是用于同步wait()和signal()函数的说法更加站不住脚。

所以我的结论是: 传递的mutex并不是为了防止wait()函数内部的Race Condition!而是因为调用wait()之前你总是获得了某个mutex(例如用于解决此处pass变量的Race Condition的mutex),并且这个mutex在你调用wait()之前必须得释放掉,调用wait()之后必须得重新获取。


所以,pthread_cond_wait()函数不是一个细粒度的函数,却是一个实用的函数。
------------------------------------------------------------------------------------------------------------------------------------

http://www.niftyadmin.cn/n/1079171.html

相关文章

利用EXCEl实现自动分组与随机点名功能

利用EXCEl实现自动分组与随机点名功能想为班级的学生随机分组吗?想随机找一个人起来回答问题吗?现在利用EXcel可以很好地解决这个问题了,只要你输入班级的学生名单就可以了。下载地址一:http://www.etthink.com/thread-5516-1-1.h…

win8+VS2012搭建OpenGL超级宝典的环境

自从公司搬到腾讯附近,每天上班都迟到20分钟左右,迟到会扣钱,两不相欠,迟到就成了心安理得的事情了。如果你光看我之前的blog,我现在告诉你目前从事游戏开发,你可能会感到惊讶。是啊,我之前从未…

中断详解(四) ——异常与异常处理

异常 8Ox86微处理器发布了大约20种不同的异常,内核必须为每一种异常提供一个异常处理程序。对于某些异常,CPU控制单元在开始执行异常处理程序前会产生一个硬件出错码(hardwar eerror code) , 并且压入内核态堆钱。(见本文最后面的…

菜单栏隐藏 | CSDN创作打卡

1. 菜单栏隐藏页面效果 2. 设计思路 页面效果:默认状态下,菜单栏正常显示;当鼠标移入时,除了鼠标选中的菜单外,其他菜单虚化,达到突出选中菜单显示的效果。 技术实现:HTML 部分选用无序列表标签…

中断详解(五)——中断处理程序

对于异常处理来说,内核只要给引起异常的进程发送一个Unix信号就能处理大多数异常。然后内核的工作就是延迟下一个动作,知道进程接收到该信号。关于异常处理,内核并没有执行多少任务,因而异常处理非常迅速。 这种方怯并不适合中断…

struts2介绍

struts2简介 Struts2框架发展 Struts于2000年5月由Craig McClanahan发起,并于 2001年7月发布了1.0版本,Struts一出现便大受欢迎,更成为了以后几年内web 开发的实际标准,Struts2是Struts的下一代产品,是在WebWork的技术…

如何在多线程中使用JNI?

如果你想了解JNI在如何在多线程下使用如果你在子线程使用JNI时遇到findClass不能找到目标Class,而在主线程下却能找到该Class的问题。或是GetEnv返回NULL的问题如果你想多学点编程技术的话 那么,这篇文章就是为你而写的, :)最近工作中遇到这么…

Python基础(1)-输入输出函数(input、print)及格式化输出

Python 中的输入输出函数,是我们编写代码时会高频使用的两种函数,本文主要介绍了 Python 的输入函数 input(),输出函数 print() 以及格式化输出。 1. 输出函数 print() print() 函数:将你想要展示的东西在 IDLE 或控制台上显示 p…