这是来自知乎的一个问题,由@吴志强提出,有意思的是,他看了大家的回答后,突然顿悟了,同一时候也发现有人答错了,于是乎。他自己回答了自己的问题。

我看完后。发现他分析的非常精彩,于是就记录在这。以下是他的自答:

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

看了之后,我获得了启示,突然认为这也许是跟条件变量的通经常使使用方法有关。



首先须要明确两点:

  • 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參数的更多相关文章

  1. C语言结构体及函数传递数组參数演示样例

    注:makeSphere()函数返回Sphere结构体,main函数中.调用makeSphere()函数,传递的第一个參数为数组,传递的数组作为指针.

  2. 使用HashMap对象传递url參数有用工具类

    代码例如以下: package com.yanek.util; import java.util.ArrayList; import java.util.Collections; import jav ...

  3. jsp中URL传递中文參数的处理

    在页面的url中使用encodeURI(encodeURI(中文)).对中文进行编码.并在server的java程序中使用URLDecoder.decode(中文, "UTF-8" ...

  4. FPGA编程基础(一)--參数传递与寄存器使用

    一.參数映射 參数映射的功能就是实现參数化元件.所谓的"參数化元件"就是指元件的某些參数是可调的,通过调整这些參数从而可实现一类结构类似而功能不同的电路.在应用中.非常多电路都可採 ...

  5. awk向脚本传递參数(二)

    命令行參数的一个重要限制是它们在BEGIN过程中是不可用的. 也就是说,直到首行输入完毕以后它们才可用.为什么?这是一个easy混乱的部分.从命令行传递的參数就好像文件名称一样被处理.赋值操作知道这个 ...

  6. nginx负载均衡向后台传递參数方法(后端也是nginxserver)

    做了一个站点是用nginx 做的负载均衡.后端也是多个nginxserver 遇到了一个问题.当做SSL支持时 前端nginx分发到 后端nginx后就成 http形式了(这样后台php用$_SERV ...

  7. Android开发之Fragment传递參数的几种方法

    Fragment在Android3.0開始提供,而且在兼容包中也提供了Fragment特性的支持. Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自己定义Fragmen ...

  8. C语言中函数和指针的參数传递

    近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

  9. 研究下JavaScript中的Rest參数和參数默认值

    研究下JavaScript中的Rest參数和參数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 參数和參数默认值. Rest 參数 通常,我们须要创建一个可变參数的函数 ...

随机推荐

  1. bzoj4977 跳伞求生——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4977 今天讲的贪心题,真神奇啊: 首先,要得到尽量多选队友的解: 把队友按 a[i] 从小到 ...

  2. JavaI/O 系统

    1.JavaI/O 系统概述 A.  输入输出(I/O):指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口 B. 流的概念(流:Stream) 流的基本特性:有数据.有方向 2. 流的 ...

  3. python关于文件的操作

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  4. Linux防火墙设置

    对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的.因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的. Linux提供了一个非常优秀的防火墙工具-netfil ...

  5. 10.3.3 WebView的几个常见功能

    (1)背景设置,例如下面的代码. webView.setBackgroundColor(0);//先设置背景色为transparent webView.setBackgroundResource(R. ...

  6. pair类型 这次遇到了,记录下来,方便彼此xue习

    首先,这个pair类型是在头文件utility.h中. 一个piar保存两个数据成员,是用来生成特定类型的模板,当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有对应的类型,两个类 ...

  7. .Net Core学习(一)

    1.安装.Net Core https://www.microsoft.com/net/core#windows 2.创建一个.Net Core项目,win+R调出控制台,输入下面命令 mkdir a ...

  8. 带"签名"的请求接口实现

    废话少说,直接上代码(⊙﹏⊙) class Program { //签名证书 public static X509Certificate2 cerSigneCert; private static c ...

  9. SharedPreferences用法

    SharedPreferences是Android四种数据存储技术中的一种,它是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信 息,其对 ...

  10. chm文件打开无显示解决办法

    右键单击chm文件---属性---在该页面选择“解除锁定”---ok!