为什么pthread_cond_wait需要传递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()函数不是一个细粒度的函数,却是一个实用的函数。

------------------------------------------------------------------------------------------------------------------------------------

为什么pthread_cond_wait需要传递mutex参数,布布扣,bubuko.com

时间: 2024-12-14 04:25:14

为什么pthread_cond_wait需要传递mutex参数的相关文章

为什么pthread_cond_wait须要传递mutex參数

这是来自知乎的一个问题,由@吴志强提出,有意思的是,他看了大家的回答后,突然顿悟了,同一时候也发现有人答错了,于是乎.他自己回答了自己的问题. 我看完后.发现他分析的非常精彩,于是就记录在这.以下是他的自答: ----------------------------------------------------------------------------- 看了之后,我获得了启示,突然认为这也许是跟条件变量的通经常使使用方法有关. 首先须要明确两点: wait()操作通常伴随着条件检測.如

[转]Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱

http://www.cnblogs.com/errorif/archive/2012/02/13/2349902.html 在Asp.Net MVC 1.0编程中,我们经常遇见这样的场景,在新建一个对象时候,通过HtmlHelper的方式在View模型中渲染Html控件,当填写完相关内容后,通过Form把需要新建的内容Post回View对应Controller的Action(例如:Create),指定的Action可以通过接受FormCollection参数.值参数或者某个类的实例参数(比如:

URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致

下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为"博客雷观" 这个栏目,增加了"全文搜索"功能,用lucene实现的.因此,需要传递中文参数.搜索框表单提交,传递中文,很简单就搞定了. 搜索之后的分页url,需要带上当前的"搜索词" ,比如"程序员",我在本地很轻松就搞定了.无非就是这样

scrapy---callback 传递自定义参数

在scrapy提交一个链接请求是用 Request(url,callback=func) 这种形式的,而parse只有一个response参数,如果自定义一个有多参数的parse可以考虑用下面的方法实现多个参数传递. def parse(self,response): yield Request(url, callback=lambda response, typeid=5: self.parse_type(response,typeid)) def parse_type(self,respon

url 传递中文参数乱码问题的终极解决方法。

估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf-8 或者gb2312. encodeURI(url),也有人说要2个encodeURI,如:window.location.href = encodeURI('b.html?cId='+id+"&cName="+encodeURIComponent(name)); 然后后台Str

SSH通过超链接传递中文参数出现乱码问题

通过超链接传递中文参数出现乱码问题 tomcat中的server.xml文件中修改如下配置: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

js的url中传递中文参数乱码,如何获取url中参数问题

一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript”> function send(){ var url = "test01.html"; var userName = $("#userName").html(); window.open(encodeURI(url + "?userName="

lambda 怎么传递ref参数

lambda 传递ref参数有个语法bug,必须要显式书写参数类型. //如 delegate bool FuncType(ref int num); FuncType func1; func1 = num => true; //错 func1 = (ref num) => true;//错 func1 = (ref int num) => true;//ok //并且,当一个参数书写类型,其他参数也要书写,总之很烦.

在JDBC中传递table参数给SQL server stored procedure

SQL Server JDBC驱动不支持直接传递Table参数给stored procedure 我的做法是先创建一个临时表,将需要插入的数据先插入到临时表里面,然后把这个临时表作为参数,传送给stored procedure.使用了Preparestatement来避免SQL注入问题. 先创建User Defined Table CREATE TYPE UserIdList AS TABLE( userId uniqueidentifier NOT NULL ); 再创建存储过程: CREAT