首页 > 编程知识 正文

c语言生产者消费者问题,生产者消费者代码实现

时间:2023-05-04 10:53:45 阅读:31169 作者:1717

操作系统生产者消费者问题c语言# include stdio.h # include pthread.h # include windows.h # definen 100 # define true1# defineproducernum 15 # define item buffer[N]={0}; int in=0; int out=0; int proCount=0; semaphore mutex=1,empty=N,full=0,proCmutex=1; void*producer(void*a ) while (真) while (proc mutex=0); proCmutex--; proCount; printf ('生产产品ID%d,缓冲区位置为%dn ),proCount,in ); proCmutex; wile(empty=0) { printf缓冲区已满! n '; (empty----; //P操作申请资源-1 /*mutex为1表示两个进程未进入需要互斥的临界区。 如果为0,则一个进程进入临界区运行,另一个进程必须等待。 如果进入块队列-1,则一个进程在临界区运行,另一个进程在块队列中运行*.while(mutex=0); mutex--; //P操作,信号量-1,缓冲池buffer [ in ]=避免同时访问pro count; //将产品放入缓冲池in=(in1 ) % N; mutex; //V操作释放资源,执行完成,信号量1、缓冲池可以访问完整; //V操作sleep(sleeptime ); //一个进程结束,}}void*consumer(void*b ) while (true ) while (full=0) ) { printf ) )缓冲区为空! n '; (满---; wile(mutex=0); mutex--; int nextc=buffer[out]; buffer[out]=0; //将消耗完成缓冲区设置为0 out=(out 1) % N; mutex; 空泡; printf((tttt产品id ) d,缓冲区位置为) dn )、nextc,out ); 滑动时间; }}int main () pthread _ tthreadpool [ producernumconsumernum ]; //创建线程池int i; for(I=0; i producerNum; I ) { pthread_t temp; //pthread_t创建用于创建定义线程类型的变量////pthread_create线程的四个参数(指向线程标识符的指针、线程属性(默认属性) )、函数起始地址和函数参数) } threadPool[i]=temp; //创建生产者流程并将其放入线程池for (I=0; i consumerNum; I ) { pthread_t temp; if(pthread_create(temp,NULL,consumer,NULL )=-1 ) { printf } error,failtocreateconsumer%d(n ',I ) exit } threadPool[i producerNum]=temp; //创建消费者进程并将其放入线程池的void * result for(I=0; i producerNum consumerNum; I () if ) pthread_join ) threadpool[I],result )=-1 ) ) printf ) failtorecollectn ' ); 退出(1; //运行线程池返回0; }生产者消费者问题主要是线程调用中加入了很多p、v操作。 其中线程调用主要使用pthread。

在Windows上使用Dev-C开发基于pthread的多线程,步骤----https://blog.csdn.net/QQ _ 41681845/article/details/89715870

使用的函数主要有以下四个函数

1、pthread_t :用于定义线程类型的变量

用法pthread_t x1;

2、pthread_create :建立线程。 它有四个参数

pthread_create(temp,NULL,print_b,NULL );

第一个参数是指向线程标识符的指针,第二个参数用于设置线程属性。 第三个参数是线程执行函数的起始地址,最后一个参数是执行函数的参数。 其中,我们的函数thread不需要参数,所以最后一个参数应该是空指针。 第二个参数也设置为空指针。 这将生成默认属性的线程。

3、pthread_join :用于等待一个线程结束。 线程开始也可以理解

第一个参数是等待线程标识符,第二个参数是用户定义的指针,可用于存储等待线程的返回值。

phread_join(threadpool[I],result );

4、pthread_exit :一个线程的结尾有两个路由。 一个函数结束后,调用它的线程也结束。 另一种方法通过函数pthread_exit来实现

执行结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。