linux 线程回顾
额,时隔两年重新写博客了。
这次看一下thread_cond_wait(pthread_cond_t * cond, pthread_mutex_t *mutex)和thread_cond_signal(pthread_cond_t *cond);
理解了这两个函数以后,同时对于java中Object的wait()和notify()方法的理解也是会有很多帮助的。
wait中的mutex是用来保护cond,wait的调用者会把wait所在的线程放置在一个线程队列中,这个线程队列等待cond的变化。此过程中的阻塞的并放弃CPU。
wait函数主要做了三件事情:
1、释放之前加过的锁;
2、阻塞并等待cond的变化;
3、返回后在把释放掉的锁再加上;
由此可是调用wait前,一定要有pthead_mutex_lock的相关操作。
而signal将会唤醒线程,值得注意的是signal函数参数只有一个:cond
一般的变成模式如下:
def process:
pthread_mutex_lock
while 是否符合条件,不符合进入循环:
pthread_cond_wait
process();
pthread_mutex_unlock
def add_meg:
pthread_mutex_lock
add()
pthread_cond_signal
pthread_mutex_unlock
注意:为什么process中要用while判断条件,wait方法本来就是要阻塞,加上while岂不是多此一举?
答:如果被唤醒以后发现条件不符合,线程并不希望继续向下执行,而是等待条件符合后在执行。
以下代码为简单实例:
/*************************************************************************
> File Name: cond.c
> Created Time: Tue 02 Sep 2014 11:31:52 PM CST
************************************************************************/ #include"local.h"//很多的.h在这里 struct msg{
struct msg * next;
} ; struct msg * workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void* pro_msg(){
struct msg *mp;
printf("pro_msg\n");
while(1){
pthread_mutex_lock(&qlock);
while(workq == NULL){
printf("into while and wait\n");
pthread_cond_wait(&qready, &qlock);
printf("afte wait\n");
}
mp = workq;
workq = mp->next;
mp->next = NULL;
pthread_mutex_unlock(&qlock);
}
} void* enq(void * mpa){
struct msg * mp = (struct msg *) mpa;
pthread_mutex_lock(&qlock);
printf("enq\n");
mp->next = workq;
workq = mp;
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
} void main(){
int err;
struct msg ww, wq;
pthread_t tid1, tid2;
workq = NULL;
err=pthread_create(&tid1, NULL, enq, (void*)&ww); if(err != 0) printf("error");
err=pthread_create(&tid1, NULL, enq, (void*)&wq); if(err != 0) printf("error");
err=pthread_create(&tid1, NULL, pro_msg, NULL); if(err != 0) printf("error");
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
}
linux 线程回顾的更多相关文章
- Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- [转]Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
转载地址:https://www.cnblogs.com/MYSQLZOUQI/p/4233630.html 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱 ...
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- linux线程的实现
首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...
- linux线程的实现【转】
转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- Linux线程学习(一)
一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
随机推荐
- SQL 2008 SP2 找不到SQL Server Engine
原文:SQL 2008 SP2 找不到SQL Server Engine 最近我有个客户碰到一个很奇怪的问题.他安装SQL server 2008 SP2的时候, SP2的安装程序无法找到SQL se ...
- atcoder它A Mountaineer
Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Dave is a mountaineer. He is ...
- Team Foundation Server 2015使用教程--团队项目删除
- 4.4、Libgdx用法查询执行环境相关性
(原版的:http://www.libgdx.cn/topic/46/4-4-libgdx%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E6%9F%A5%E8%AF%A2% ...
- Android——保存并读取文件
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,仅仅能被应用本身訪问,在该模式下,写入的内容会覆盖原文件的内容,假设想把新写入的内容追加到原文件里.能够使用Contex ...
- 开展project
正常的生活之路
相对刚走出学校的学生在其他行业工作,竞争力的薪酬,同时.并不断地不仅学习更新专业知识让你感到生活的充实,更满足了你那不让外人知的虚荣心.在刚出校门的几年中,你常常回头看看被你落在后面的同学们,在内心怜 ...
- 我的MYSQL学习心得(六)
原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- 从头开始学JavaScript (十)——垃圾收集
原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...
- NYoj 素数环(深搜入门)
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=488 深搜模板: void dfs(int 当前状态) { if(当前状态为边界状 ...
- 多校训练赛2 ZCC loves cards
ZCC loves cards Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...