加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2021-01-21 21:18:36 所属栏目:Linux 来源:网络整理
导读:副标题#e# div class="cnblogs_code" include stdio.hspan style="color: #000000;" include semaphore.hspan style="color: #000000;" include stdlib.hspan style="color: #000000;" include pthread.hspan style="color: #000000;" include unistd.h spa
副标题[/!--empirenews.page--]

<div class="cnblogs_code">

include <stdio.h><span style="color: #000000;">

include <semaphore.h><span style="color: #000000;">

include <stdlib.h><span style="color: #000000;">

include <pthread.h><span style="color: #000000;">

include <unistd.h>

<span style="color: #0000ff;">#define N1 3<span style="color: #008000;">//<span style="color: #008000;">定义3个生产者
<span style="color: #0000ff;">#define N2 4<span style="color: #008000;">//<span style="color: #008000;">定义4 个消费者
<span style="color: #0000ff;">#define M 10<span style="color: #008000;">//<span style="color: #008000;">定义10个大小缓冲区

<span style="color: #0000ff;">int <span style="color: #0000ff;">in = <span style="color: #800080;">0<span style="color: #000000;">;
<span style="color: #0000ff;">int <span style="color: #0000ff;">out = <span style="color: #800080;">0<span style="color: #000000;">;

<span style="color: #0000ff;">int buff[M] = {<span style="color: #800080;">0};<span style="color: #008000;">//<span style="color: #008000;">缓冲区大小为10
<span style="color: #000000;">
sem_t empty_sem;<span style="color: #008000;">//<span style="color: #008000;">空缓冲区数量
sem_t full_sem;<span style="color: #008000;">//<span style="color: #008000;">满缓冲区数量
pthread_mutex_t mutex;<span style="color: #008000;">//<span style="color: #008000;">互斥访问缓冲区

<span style="color: #0000ff;">int product_id = <span style="color: #800080;">0<span style="color: #000000;">;
<span style="color: #0000ff;">int consumer_id = <span style="color: #800080;">0<span style="color: #000000;">;

<span style="color: #0000ff;">int<span style="color: #000000;"> data;
FILE *<span style="color: #000000;">fp;

<span style="color: #0000ff;">void *<span style="color: #000000;"> product()
{
<span style="color: #0000ff;">int id = ++<span style="color: #000000;">product_id;
<span style="color: #0000ff;">while(<span style="color: #800080;">1<span style="color: #000000;">)
{
sleep(<span style="color: #800080;">1<span style="color: #000000;">);
sem_wait(&<span style="color: #000000;">empty_sem);
pthread_mutex_lock(&<span style="color: #000000;">mutex);
<span style="color: #008000;">//<span style="color: #008000;">if(feof(fp) != 0) fseek(fp,SEEK_SET);
<span style="color: #0000ff;">if(fscanf(fp,<span style="color: #800000;">"<span style="color: #800000;">%d<span style="color: #800000;">",&data)==<span style="color: #000000;">EOF)
{
fseek(fp,<span style="color: #800080;">0<span style="color: #000000;">,SEEK_SET);
fscanf(fp,<span style="color: #800000;">"<span style="color: #800000;">%d<span style="color: #800000;">",&<span style="color: #000000;">data);
}
<span style="color: #0000ff;">in = <span style="color: #0000ff;">in %<span style="color: #000000;"> M;
buff[<span style="color: #0000ff;">in] =<span style="color: #000000;"> data;
printf(<span style="color: #800000;">"<span style="color: #800000;">Producter %d produce %d in position %dn<span style="color: #800000;">",id,buff[<span style="color: #0000ff;">in],<span style="color: #0000ff;">in<span style="color: #000000;">);
++<span style="color: #0000ff;">in<span style="color: #000000;">;
pthread_mutex_unlock(&<span style="color: #000000;">mutex);
sem_post(&<span style="color: #000000;">full_sem);
}
}

<span style="color: #0000ff;">void *<span style="color: #000000;">consume()
{
<span style="color: #0000ff;">int id = ++<span style="color: #000000;">consumer_id;

</span><span style="color: #0000ff;"&gt;while</span>(<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;)
{
    sleep(</span><span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;);
    sem_wait(</span>&amp;<span style="color: #000000;"&gt;full_sem);
    pthread_mutex_lock(</span>&amp;<span style="color: #000000;"&gt;mutex);

    </span><span style="color: #0000ff;"&gt;out</span> = <span style="color: #0000ff;"&gt;out</span> %<span style="color: #000000;"&gt; M;
    printf(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Consumer %d take product  %d in position %dn</span><span style="color: #800000;"&gt;"</span>,buff[<span style="color: #0000ff;"&gt;out</span>],<span style="color: #0000ff;"&gt;out</span><span style="color: #000000;"&gt;);
    buff[</span><span style="color: #0000ff;"&gt;out</span>] = <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;;
    </span>++<span style="color: #0000ff;"&gt;out</span><span style="color: #000000;"&gt;;

    pthread_mutex_unlock(</span>&amp;<span style="color: #000000;"&gt;mutex);
    sem_post(</span>&amp;<span style="color: #000000;"&gt;empty_sem);

}

}

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读