生产者消费者的例子-使用条件变量

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #include <pthread.h>
 5
 6 pthread_mutex_t x;
 7 pthread_cond_t cv;
 8 static int s=0;
 9
10 int rand_num[100]={0};
11 int  rd=0,wt=0;
12
13 void* threadConsumer(void* param)
14 {
15    int r;
16    int tid=*(int*)param;
17    while(1)
18    {
19         pthread_mutex_lock(&x);
20         while(s<=0)
21         {
22             printf("%u waiiting...\n",tid);
23             pthread_cond_wait(&cv,&x);
24         }
25         r = rd;
26         printf("%u get number %d %d\n",tid,r,rand_num[r]);
27         rand_num[r]=0;
28         rd=++rd%100;
29
30         s--;
31
32         pthread_mutex_unlock(&x);
33         usleep(0);
34     }
35
36 }
37
38 void* threadProduct(void* param)
39 {
40     int i=0;
41     rd=wt=0;
42
43     while(1)
44     {
45         unsigned int seed = time(NULL);
46         int left=0,left2;
47         pthread_mutex_lock(&x);
48
49         left=(wt>=rd)?(100-wt+rd):(rd-wt);
50         if(left==0||s==100)
51         {
52           pthread_mutex_unlock(&x);
53           usleep(0);
54           continue;
55         }
56
57         left2=left;
58
59         while(left>0)
60         {
61             rand_num[wt]=rand_r(&seed);
62             wt=++wt%100;
63             s++;
64             left--;
65         }
66         pthread_mutex_unlock(&x);
67
68         pthread_cond_broadcast(&cv);
69                 printf("new add %d\n",left2);
70                 usleep(0);
71     }
72 }
73
74 int main(int arc ,char** argv)
75 {
76     int i=0;
77     pthread_t tids[101]={0};
78     pthread_attr_t attr;
79
80     pthread_attr_init(&attr);
81
82     for(i=0;i<50;i++)
83     {
84         pthread_create(&tids[i],&attr,threadConsumer,(void*)(tids+i));
85     }
86
87     pthread_create(&tids[i],&attr,threadProduct,(void*)(tids+100));
88
89     pthread_join(tids[i],NULL);
90
91     return 0;
92
93 }
时间: 2024-10-29 07:43:37

生产者消费者的例子-使用条件变量的相关文章

多个生产者——多个消费者模型(互斥量条件变量实现)

1. 介绍 生产者消费者问题属于有界缓冲区问题.我们现在讲述多个生产者向一个缓冲区中存入数据,多个生产者从缓冲区中取数据. 共享缓冲区作为一个环绕缓冲区,存数据到头时再从头开始. 2. 实现 我们使用一个互斥量保护生产者向缓冲区中存入数据. 由于有多个生产者,因此需要记住现在向缓冲区中存入的位置. 使用一个互斥量保护缓冲区中消息的数目,这个生产的数据数目作为生产者和消费者沟通的桥梁. 使用一个条件变量用于唤醒消费者.由于有多个消费者,同样消费者也需要记住每次取的位置. 4.代码 在选项中选择生产

通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll

wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等待这个对象的监视器.notifyAll(): 唤醒在这个对象监视器上等待的所有线程.这三个方法,都是Java语言提供的实现线程间阻塞(Blocking)和控制进程内调度(inter-process communication)的底层机制.下面通过一个生产者/消费者的例子来讲解这三个方法的使用 /**

生成者消费者(线程同步,互斥,条件变量)

#include <unistd.h> #include "stdio.h" #include <stdlib.h> #include <pthread.h> #define N_CONSUMER 3 //消费者数量 #define N_PRODUCER 2 //生产者数量 #define C_SLEEP 1 //控制 consumer 消费的节奏 #define P_SLEEP 1 //控制 producer 生产的节奏 pthread_t cti

kafka集群配置和java编写生产者消费者操作例子

kafka 安装 修改配置文件 java操作kafka kafka kafka的操作相对来说简单很多 安装 下载kafka http://kafka.apache.org/downloads tar -zxvf kafka_2.12-2.1.0.tgz rm kafka_2.12-2.1.0.tgz mv kafka_2.12-2.1.0 kafka sudo vim /etc/profile export KAFKA_HOME=/usr/local/kafka export PATH=$PAT

生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 使用互斥量锁住一块代码方法如下(默认忽略pthread开头的函数的错误检查,即类似 int s = pthread_xxx(...); if (s != 0) { printErrorMsg(

生产者消费者模式(吃包子例子)

生产者-消费者问题是一个经典的进程同步问 题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空 缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费 者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 生产者消费者模式是并发.多线程编程中经典的设计

python3.4多线程实现同步的四种方式(锁机制、条件变量、信号量和同步队列)

临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区. threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁 import threading import time class Num: def __init__(self): self.num = 0 self.lock = threading.Lock() def add(self)

linux系统编程:线程同步-条件变量(cond)

线程同步-条件变量(cond) 生产者与消费者问题 再引入条件变量之前,我们先看下生产者和消费者问题:生产者不断地生产产品,同时消费者不断地在消费产品. 这个问题的同步在于两处:第一,消费者之间需要同步:同一件产品只可由一人消费.第二,当无产品可消费时,消费者需等待生产者生产后,才可继续消费,这又是一个同步问题.详细了解:生产者消费者问题. 条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,并且条件变量总是和互斥锁结合在一起. 相关函数 pthread_cond_t //条件变量类

浅谈生产者消费者模型与读写者模型的区别

多线程编程在操作系统中是十分重要的. 而在线程中处理同步与互斥问题又是至关重要的.生产者-消费者模型,(也称有限缓冲问题)是一个多线程同步问题的经典例子.下来我们对其进行简单分析. 生产者-->生成一定量的数据放到缓冲区中,然后重复此过程: 消费者-->在缓冲区消耗这些数据. 而生产者-消费者之间存在三种关系,即 生产者与生产者之间是互斥关系: 消费者与消费者之间是互斥关系: 生产者与消费者之间是同步与互斥关系. 下面的程序演示了一个生产者-消费者的例子,生产者生产一个结构体串在链表的表头上,