<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;">while</span>(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">){ sleep(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); sem_wait(</span>&<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">f<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>l_sem); pthread_mutex_lock(</span>&<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">mutex); </span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span> = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span> %<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"> M; printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">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;">"</span>,buff[<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span>],<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); buff[</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span>] = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">; </span>++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">out</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">; pthread_mutex_unlock(</span>&<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">mutex); sem_post(</span>&<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">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;">int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"> i;</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"> ret1[N1];</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">int</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"> ret2[N2];</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">int</span> ini1 = sem_init(&empty_sem,<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span>,M); <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">初始化空缓冲区 为 M(10)</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">int</span> ini2 = sem_init(&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;">0</span>);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">初始化满缓冲区 0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">if</span>(ini1 && ini2 != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">){ printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">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;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">);}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">int</span> ini3 = pthread_mutex_init(&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;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">初始化互斥信号量</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">if</span>(ini3 != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;"> ){ printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">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;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">);}fp </span>= fopen(<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">/.data.txt</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span>,<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">r</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span>);<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">打开<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;">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;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">);</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span>; i < N1; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">){ ret1[i] </span>= pthread_create(&<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;">vo<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a></span>*)(&i));<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"><a href="https://m.jb51.cc/tag/chuangjian/" target="_blank" >创建</a>生产者线程</span> <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">if</span>(ret1[i] != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">) { printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">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;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">,i); exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); }}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span>; i< N2; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">){ ret2[i] </span>= pthread_create(&<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;">//</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #008000;"><a href="https://m.jb51.cc/tag/chuangjian/" target="_blank" >创建</a>消费者线程</span> <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">if</span>(ret2[i] != <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">) { printf(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800000;">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;">"</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">,i); exit(</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">1</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">); }}</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #0000ff;">for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span>; i < N1; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">) {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;">for</span>(i = <span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #800080;">0</span>; i < N2; i++<span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">) {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;">0</span><span https://m.jb51.cc/tag/color/" target="_blank" >color</a>: #000000;">);
}
总结
以上是内存溢出为你收集整理的Linux环境下实现生产者消费者问题全部内容,希望文章能够帮你解决Linux环境下实现生产者消费者问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)