线程的相关知识3

头文件:#include <semaphore.h> 
sem_init 
函数的作用:初始化信号量 
原型:int sem_init(sem_t *sem,int pshared,unsigned int value) 
参数:sem:信号量指针 
         pshared:0 
         value:信号量的初始化 
  返回值:成功:0,出错-1 
   
  信号量的PV操作,销毁 
  函数原型: 
   
  /*P操作*/ 
  int sem_wait(sem_t *sem); 
  int sem_trywait(sem_t *sem); 
  /*V操作*/ 
  int sem_post(sem_t *sem); 
  //获取信号量的值 
  int sem_getvalue(sem_t *sem); 
  //销毁信号量 
  int sem_deatroy(sem_t *sem); 
 
 
参数:sem:信号量指针 
返回值:成功为0,出错为-1

使用PV操作,完成生产者和消费者之间

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<stdio.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<stdlib.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<unistd.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<pthread.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<sys/ipc.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<semaphore.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include<fcntl.h></span>


<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> buff[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>];
sem_t mutex,full;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> fd;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> productor(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *arg)
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)
    {
        sem_wait(&mutex);
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%s"</span>,buff);
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"the product is %s\n"</span>,buff);
    sem_post(&full);
    }
}


<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> customer(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *arg)
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)
    {
        sem_wait(&full);
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"the customer has buy %s\n"</span>,buff);
    sem_post(&mutex);
    }
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main()
{
    pthread_t id1;
    pthread_t id2;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ret;

    ret = sem_init(&mutex,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    ret+= sem_init(&full,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ret != <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)
    {
        perror(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sem_init"</span>);
    }

    pthread_create(&id1,NULL,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>*)productor,NULL);

    pthread_create(&id2,NULL,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>*)customer,NULL);

    pthread_join(id1,NULL);
    pthread_join(id2,NULL);

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}</code>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值