博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pthread_cond_wait()函数的理解(摘录)
阅读量:6477 次
发布时间:2019-06-23

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

 

/************pthread_cond_wait()的使用方法**********/

pthread_mutex_lock(&qlock);    /*lock*/
pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/
pthread_mutex_unlock(&qlock); /*unlock*/

/*****************************************************/

调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得

其它线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。

当pthread_cond_wait返回的时候又自动给mutex加锁

 

了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 

首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象,然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点,但是现在却没有节点。因此,它只能: 
锁定互斥对象时,线程将调用 pthread_cond_wait(&mycond,&mymutex)。pthread_cond_wait() 调用相当复杂,因此我们每次只执行它的一个操作。 
pthread_cond_wait() 所做的第一件事就是同时对互斥对象解锁(于是其它线程可以修改已链接列表),并等待条件 mycond 发生(这样当 pthread_cond_wait() 接收到另一个线程的“信号”时,它将苏醒)。现在互斥对象已被解锁,其它线程可以访问和修改已链接列表,可能还会添加项。 【要求解锁并阻塞是一个原子操作

此时,pthread_cond_wait() 调用还未返回。对互斥对象解锁会立即发生,但等待条件 mycond 通常是一个阻塞操作,这意味着线程将睡眠,在它苏醒之前不会消耗 CPU 周期。这正是我们期待发生的情况。线程将一直睡眠,直到特定条件发生,在这期间不会发生任何浪费 CPU 时间的繁忙查询。从线程的角度来看,它只是在等待 pthread_cond_wait() 调用返回。 

现在继续说明,假设另一个线程(称作“2 号线程”)锁定了 mymutex 并对已链接列表添加了一项。在对互斥对象解锁之后,2 号线程会立即调用函数 pthread_cond_broadcast(&mycond)。此操作之后,2 号线程将使所有等待 mycond 条件变量的线程立即苏醒。这意味着第一个线程(仍处于 pthread_cond_wait() 调用中)现在将苏醒。 
现在,看一下第一个线程发生了什么。您可能会认为在 2 号线程调用 pthread_cond_broadcast(&mymutex) 之后,1 号线程的 pthread_cond_wait() 会立即返回。不是那样!实际上,pthread_cond_wait() 将执行最后一个操作:重新锁定 mymutex。一旦 pthread_cond_wait() 锁定了互斥对象,那么它将返回并允许 1 号线程继续执行。那时,它可以马上检查列表,查看它所感兴趣的更改。 

 

转载于:https://www.cnblogs.com/sanchrist/p/3942267.html

你可能感兴趣的文章
今日内容(起步)
查看>>
压缩文档相关的工具类
查看>>
[LeetCode] 2. Add Two Nums
查看>>
HDU2044 一只小蜜蜂...
查看>>
python引入模块时import与from ... import的区别
查看>>
如何查看和清除oracle无用的连接进程
查看>>
hbase分布式安装
查看>>
705. New Distinct Substrings spoj(后缀数组求所有不同子串)
查看>>
第二冲刺阶段第六天
查看>>
@staticmethod和@classmethod
查看>>
声明变量&定义变量
查看>>
编程给用户设置权限
查看>>
Android静默安装
查看>>
Python 反射-isinstance-issubclass-__str__-__del__
查看>>
MAC
查看>>
Struts06---通配符的使用
查看>>
javaScript年份下拉列表框内容为当前年份及前后50年
查看>>
关于jquery 集合对象的 each和click方法的 思考 -$(this)的认识
查看>>
性能测试性能分析
查看>>
as3 声明变量
查看>>