额,时隔两年重新写博客了。

这次看一下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岂不是多此一举?

答:如果被唤醒以后发现条件不符合,线程并不希望继续向下执行,而是等待条件符合后在执行。

以下代码为简单实例:

  1. /*************************************************************************
  2. > File Name: cond.c
  3. > Created Time: Tue 02 Sep 2014 11:31:52 PM CST
  4. ************************************************************************/
  5.  
  6. #include"local.h"//很多的.h在这里
  7.  
  8. struct msg{
  9. struct msg * next;
  10. } ;
  11.  
  12. struct msg * workq;
  13.  
  14. pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
  15. pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
  16.  
  17. void* pro_msg(){
  18. struct msg *mp;
  19. printf("pro_msg\n");
  20. while(1){
  21. pthread_mutex_lock(&qlock);
  22. while(workq == NULL){
  23. printf("into while and wait\n");
  24. pthread_cond_wait(&qready, &qlock);
           printf("afte wait\n");
  25. }
  26. mp = workq;
  27. workq = mp->next;
  28. mp->next = NULL;
  29. pthread_mutex_unlock(&qlock);
  30. }
  31. }
  32.  
  33. void* enq(void * mpa){
  34. struct msg * mp = (struct msg *) mpa;
  35. pthread_mutex_lock(&qlock);
  36. printf("enq\n");
  37. mp->next = workq;
  38. workq = mp;
  39. pthread_mutex_unlock(&qlock);
  40. pthread_cond_signal(&qready);
  41. }
  42.  
  43. void main(){
  44. int err;
  45. struct msg ww, wq;
  46. pthread_t tid1, tid2;
  47. workq = NULL;
  48. err=pthread_create(&tid1, NULL, enq, (void*)&ww); if(err != 0) printf("error");
  49. err=pthread_create(&tid1, NULL, enq, (void*)&wq); if(err != 0) printf("error");
  50. err=pthread_create(&tid1, NULL, pro_msg, NULL); if(err != 0) printf("error");
  51. pthread_join(tid1, NULL);
  52. pthread_join(tid2, NULL);
  53. }

 

linux 线程回顾的更多相关文章

  1. Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

  2. Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

  3. [转]Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    转载地址:https://www.cnblogs.com/MYSQLZOUQI/p/4233630.html 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱 ...

  4. [转载]Linux 线程实现机制分析

    本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...

  5. linux线程的实现

    首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...

  6. linux线程的实现【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...

  7. Linux线程-创建

    Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...

  8. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  9. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

随机推荐

  1. 非阻塞IOserver型号

    让我们来考虑一个场景,你和百万玩家的魔兽世界的忠实粉丝.时间之旅打每到周末boss. 每当周末比赛server在亚历山大,因为至少在同一时间数十万用户在线. 假设我们的多-threaded果酱serv ...

  2. 移动端 常见布局CSS3的细节

    结合 Framework7 和ios UI系统,微信weUI,支付宝H5    我们在移动端一些css用法 细节的有了更深的了解: 高斯模糊的显示效果,ios8以上支持,ios8以上0.5px,bac ...

  3. ubuntu,从一个新用户,要转到新用户的命令行操作

    shibo-ubuntu@ubuntu:~$ sudo useradd karen [sudo] password for shibo-ubuntu:  shibo-ubuntu@ubuntu:~$ ...

  4. SQL Tuning Health-Check Script (SQLHC)

    1. 纯手工打造 工具:程序员的双手 特点:手写客户端与服务器端验证代码 2. 半手工半自动 工具:jquery.validate(客户端) + DataAnnotations & DataA ...

  5. 1067: spark.components:NavigatorContent 类型值的隐式强制指令的目标是非相关类型 String

    1.错误描写叙述 此行的多个标记: -workId -1067: spark.components:NavigatorContent 类型值的隐式强制指令的目标是非相关类型 String. 2.错误原 ...

  6. zTree实现访问到第一节点在相同水平当前所选节点数目

    zTree实现访问到第一节点在相同水平当前所选节点数目 1.实现源代码 <!DOCTYPE html> <html> <head> <title>zTr ...

  7. Linux 编程学习笔记----动笔makefile档

    Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...

  8. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  9. 使用PHP顶替JS有趣DOM

    較简单,我须要把一个导航页的数据整理好写入数据库.一个比較直观的方法是对html文件进行分析.通用的方法是用php的正則表達式来匹配.可是这样做开发和维护都非常困难,代码可读性非常差. 导航页的数据都 ...

  10. MVC4 + EF为Model添加单独的验证属性

    可使用以下方式给Model加上相关的meta验证属性,这样实体的验证属性就不会被例如EF或其他工具自动生成的Model所替换了. using System.ComponentModel.DataAnn ...