1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 pthread_mutex_t mutex;
 6 pthread_cond_t cond_full;
 7 pthread_cond_t cond_empty;
 8 
 9 int g_iBufSize = ;
 
 void *thread_producer(void* arg)
 {
     while(true)
     {
         printf("thread_producer:pthread_mutex_lock\n");
         pthread_mutex_lock(&mutex);
         // 拿到lock就可以访问,不会冲突,但是不一定满足条件,cond是为了在满足条件的时候通知另一个进程
         if( != g_iBufSize) //如果条件不满足就调用wait函数等待条件满足
         {
             printf("thread_producer:pthread_cond_wait cond_empty \n");
             pthread_cond_wait(&cond_empty, &mutex); // 这句话的前提是先有锁,这时候会自动先解锁,等到时机来临在加锁
         }
         
         //前面的wait操作已经包含了枷锁,这里直接访问
         printf("thread_producer>>>>>\n");
         g_iBufSize = ;
         
         printf("thread_producer: pthread_cond_signal\n");
         pthread_cond_signal(&cond_full);
    
         pthread_mutex_unlock(&mutex);
     }
     return NULL;
 }
 
 void *thread_consumer(void* arg)
 {
     while(true)
     {
         printf("thread_consumer:pthread_mutex_lock\n");
         pthread_mutex_lock(&mutex);
         if( == g_iBufSize)
         {
             printf("thread_consumer: pthread_cond_wait\n");
             pthread_cond_wait(&cond_full, &mutex);
         }
         
         printf("thread_consumer>>>\n");
         g_iBufSize = ;
         
         printf("thread_consumer: pthread_cond_signal\n");
         pthread_cond_signal(&cond_empty);
         
         pthread_mutex_unlock(&mutex);
 
     }
     return NULL;
 }
 
 //g++ -o bin1 -lpthread mutithread.cpp
 
 int main()
 {
     void *retval1, *retval2;
     pthread_t thread_id_1, thread_id_2;
     
     pthread_mutex_init(&mutex, NULL);
     pthread_cond_init(&cond_full, NULL);
     pthread_cond_init(&cond_empty, NULL);
     
     pthread_cond_signal(&cond_empty);
     pthread_create(&thread_id_1, NULL, thread_producer, NULL);//int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void*),void *arg);
     pthread_create(&thread_id_2, NULL, thread_consumer, NULL);
      
     pthread_join(thread_id_1, &retval1); // 阻塞等线程执行完
     pthread_join(thread_id_2, &retval2);
     
     pthread_cond_destroy(&cond_full);
     pthread_cond_destroy(&cond_empty);
     pthread_mutex_destroy(&mutex);
     
     return ;
 }

linux ptheard 生产者消费者的更多相关文章

  1. Linux 信号量 生产者消费者小例题

    菜鸟偶遇信号量,擦出火花(只有不熟才会有火花).于是上网搜资料和看<Unix环境高级编程>实现了几个小例题,高手请勿喷!这几位写得非常好啊: 题目来源: http://www.it165. ...

  2. linux进程 生产者消费者

    #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> # ...

  3. Linux 进程间通信(包含一个经典的生产者消费者实例代码)

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...

  4. linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题

    生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中 ...

  5. Linux线程编程之生产者消费者问题

    前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 ...

  6. Linux C多线程实现生产者消费者

    今天学习了用Linux C进行线程的同步,实现类似生产者消费者的问题.下面我就来分享我的代码 #include<stdio.h> #include<pthread.h> #in ...

  7. Linux线程编程之生产者消费者问题【转】

    转自:http://www.cnblogs.com/clover-toeic/p/4029269.html 前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注 ...

  8. Linux组件封装(五)一个生产者消费者问题示例

    生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次 ...

  9. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

随机推荐

  1. POJ 1179 IOI1998 Polygon

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5472   Accepted: 2334 Description Polyg ...

  2. Thinkpad SL400安装黑苹果10.8.4全纪录

    提要 还在为学习苹果开发的装备发愁么 ,也许这篇文章会给你带来一些启发. 关于黑苹果:从苹果采用intel的处理器之后,mac os被黑客破解之后可以安装在PC上,从而出现了一大批未购买苹果机而使用苹 ...

  3. GNOME3启动时出错:Oh no! Something has gone wrong.Logout!

    今天用虚拟机安装debian7.1,在启动的时候遇到登录失败的问题,用GNOME Classic可以登录,特地记录如下: 原文出处:http://r3dux.org/2011/11/how-to-fi ...

  4. TCP并发server,每个客户一个子进程

    今天笔者带来的是server型号第一,这是最经常使用的模型的最基本的一个–TCP并发server,每个客户一个子进程. 首先简单介绍:TCP并发server,每个客户一个子进程,并发server调用f ...

  5. java list&lt;string&gt;组 传递到值js排列

    方法一 后台:     String sql = "select * from tree";     list = this.treeService.getTreeList(sql ...

  6. Redis学习手册(事务)

    一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据 ...

  7. linux中安装easy_install(setuptools)

    假设是相似于ubuntu的带桌面的系统直接下载安装就能够了.下面是针对centOS的命令行安装方法 最好先查看版本号号,依据版本号来选择安装方法.终端命令例如以下 # lsb_release -a 版 ...

  8. windows下把Apache加入系统服务

    始 --- 运行,输入cmd,再打开一个命令提示符.分别输入如下命令(每行回车) cd到Apache24\binhttpd.exe-k install-n"servicename" ...

  9. 监控mysql索引使用效率的脚本

      SELECT  t.table_schema AS db,  t.table_name   AS tab_name,  s.index_name   AS index_name,  s.colum ...

  10. c++ 数据持久层研究(一)

    C++ORM框架自动生成代码数据库  用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...