Linux环境下实现生产者消费者问题

Linux环境下实现生产者消费者问题,第1张

概述#include <stdio.h>#include <semaphore.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#define N1 3//定义3个生产者#define N2 4//定义4 个消费者#define M 10//定义10个大小缓冲区int in = 0;int out = 0;int buff[M] = {0};//缓冲区大小为10sem_t empty_sem;//空缓冲区数量sem_t full_sem;//满缓冲区数量pthread_mutex_t mutex;//互斥访问缓冲区int product_id = 0;int consumer_id = 0;int data;FILE *fp;void * product(){int id = ++product_id;while(1){sleep(1);sem_wait(&empty_sem);pthread_mutex_lock(&mutex);//if(feof(fp) != 0) fseek(fp, 0, SEEK_SET);if(fscanf(fp, "%d", &data)==EOF){fseek(fp, 0, SEEK_SET);fscanf(fp, "%d", &data);}in = in % M;buff[in] = data;printf("Producter %d produce %d in position %dn", id, buff[in], in);++in;pthread_mutex_unlock(&mutex);sem_post(&full_sem);}}void *consume(){int id = ++consumer_id;while(1){sleep(1);sem_wait(&full_sem);pthread_mutex_lock(&mutex);out = out % M;printf("Consumer %d take product %d in position %dn", id, buff[out], out);buff[out] = 0;++out;pthread_mutex_unlock(&mutex);sem_post(&empty_sem);}}int main(){pthread_t id1[N1];//定义生产者线程pthread_t id2[N2];//定义消费者线程int i;int ret1[N1];int ret2[N2];int ini1 = sem_init(&empty_sem, 0, M); //初始化空缓冲区 为 M(10)int ini2 = sem_init(&full_sem, 0, 0);//初始化满缓冲区 0if(ini1 && ini2 != 0){printf("Sem init failedn");exit(1);}int ini3 = pthread_mutex_init(&mutex, NULL);//初始化互斥信号量if(ini3 != 0 ){printf("mutex init failedn");exit(1);}fp = fopen("/.data.txt", "r");//打开文件Data.txtif(fp == NULL) exit(1);for(i = 0; i < N1; i++){ret1[i] = pthread_create(&id1[i], NULL, product, (void*)(&i));//创建生产者线程if(ret1[i] != 0){printf("product%d creat failedn", i);exit(1);}}for(i = 0; i< N2; i++){ret2[i] = pthread_create(&id2[i], NULL, consume, NULL);//创建消费者线程if(ret2[i] != 0){printf("consumer%d creat failedn", i);exit(1);}}for(i = 0; i < N1; i++) {pthread_join(id1[i], NULL);}for(i = 0; i < N2; i++) {pthread_join(id2[i], NULL);}exit(0);} 

<div >

<stdio.h><span >include <semaphore.h><span >include <stdlib.h><span >include <pthread.h><span >include <unistd.h>

<span >#define N1 3<span >//<span >定义3个生产者
<span >#define N2 4<span >//<span >定义4 个消费者
<span >#define M 10<span >//<span >定义10个大小缓冲区

<span >int <span >in = <span >0<span >;
<span >int <span >out = <span >0<span >;

<span >int buff[M] = {<span >0};<span >//<span >缓冲区大小为10
<span >
sem_t empty_sem;<span >//<span >空缓冲区数量
sem_t full_sem;<span >//<span >满缓冲区数量
pthread_mutex_t mutex;<span >//<span >互斥访问缓冲区

<span >int product_ID = <span >0<span >;
<span >int consumer_ID = <span >0<span >;

<span >int<span > data;
file *<span >fp;

<span >voID *<span > product()
{
<span >int ID = ++<span >product_ID;
<span >while(<span >1<span >)
{
sleep(<span >1<span >);
sem_wait(&<span >empty_sem);
pthread_mutex_lock(&<span >mutex);
<span >//<span >if(feof(fp) != 0) fseek(fp,SEEK_SET);
<span >if(fscanf(fp,<span >"<span >%d<span >",&data)==<span >EOF)
{
fseek(fp,<span >0<span >,SEEK_SET);
fscanf(fp,<span >"<span >%d<span >",&<span >data);
}
<span >in = <span >in %<span > M;
buff[<span >in] =<span > data;
printf(<span >"<span >Producter %d produce %d in position %d\n<span >",ID,buff[<span >in],<span >in<span >);
++<span >in<span >;
pthread_mutex_unlock(&<span >mutex);
sem_post(&<span >full_sem);
}
}

<span >voID *<span >consume()
{
<span >int ID = ++<span >consumer_ID;

</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;while</span>(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;){    sleep(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    sem_wait(</span>&amp;<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;f<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>l_sem);    pthread_mutex_lock(</span>&amp;<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;mutex);    </span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span> = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span> %<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt; M;    printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;Consumer %d take product  %d in <a href="https://m.jb51.cc/tag/position/" target="_blank" >position</a> %d\n</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span>,buff[<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span>],<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    buff[</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span>] = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;;    </span>++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;out</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;;    pthread_mutex_unlock(</span>&amp;<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;mutex);    sem_post(</span>&amp;<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;empty_sem);}

}

<span >int<span > main()
{
pthread_t ID1[N1];<span >//<span >定义生产者线程
pthread_t ID2[N2];<span >//<span >定义消费者线程

<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt; i;</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt; ret1[N1];</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt; ret2[N2];</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span> ini1 = sem_init(&amp;empty_sem,<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>,M);  <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;初始化空缓冲区 为 M(10)</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span> ini2 = sem_init(&amp;f<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>l_sem,<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;初始化满缓冲区  0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;if</span>(ini1 &amp;&amp; ini2 != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;){    printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;Sem init <a href="https://www.jb51.cc/tag/Failed/" target="_blank" >Failed</a>\n</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;int</span> ini3 = pthread_mutex_init(&amp;mutex,N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;初始化互斥信号量</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;if</span>(ini3 != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt; ){    printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;mutex init <a href="https://www.jb51.cc/tag/Failed/" target="_blank" >Failed</a>\n</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);}fp </span>= fopen(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;/.data.txt</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span>,<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;r</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span>);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;打开<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" >文件</a>Data.txt</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;if</span>(fp == N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L) exit(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>; i < N1; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;){    ret1[i] </span>= pthread_create(&amp;<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a>1[i],N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L,product,(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;vo<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a></span>*)(&amp;i));<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;<a href="https://m.jb51.cc/tag/chuangjian/" target="_blank" >创建</a>生产者线程</span>    <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;if</span>(ret1[i] != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;)    {        printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;product%d creat <a href="https://www.jb51.cc/tag/Failed/" target="_blank" >Failed</a>\n</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;,i);        exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    }}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>; i< N2; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;){    ret2[i] </span>= pthread_create(&amp;<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a>2[i],consume,N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"&gt;<a href="https://m.jb51.cc/tag/chuangjian/" target="_blank" >创建</a>消费者线程</span>    <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;if</span>(ret2[i] != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;)    {        printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;consumer%d creat <a href="https://www.jb51.cc/tag/Failed/" target="_blank" >Failed</a>\n</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;"&gt;"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;,i);        exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);    }}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>; i < N1; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;) {pthread_join(<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a>1[i],N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L);}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;"&gt;for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span>; i < N2; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;) {pthread_join(<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a>2[i],N<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>L);}exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;"&gt;0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"&gt;);

}

 

总结

以上是内存溢出为你收集整理的Linux环境下实现生产者消费者问题全部内容,希望文章能够帮你解决Linux环境下实现生产者消费者问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1050563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存