• 基于信号量与互斥锁实现的生产者和消费者


    • 信号量API
      •  #include <semaphore.h>
        2 //等待互斥量(原子操作)
        3 int sem_wait(sem_t *serm);
        4 //通知互斥量加一
        5 int sem_post(sem_t *sem);
    •  基于信号量与互斥锁实现的生产者和消费者
      •   1 #include <stdio.h>
          2 #include <stdlib.h>
          3 #include <unistd.h>
          4 #include <sys/types.h>
          5 #include <pthread.h>
          6 #include <errno.h>
          7 #include <string.h>
          8 #include <semaphore.h>
          9 
         10 #define ERR_EXIT(m)
         11     do
         12     {
         13         perror(m);
         14         exit(EXIT_FAILURE);
         15     }while(0)
         16 
         17 #define CONSUMER_COUNT 1
         18 #define PRODUCE_COUNT 2
         19 
         20 #define BUFFSIZE 10
         21 int g_buffer[BUFFSIZE];
         22 
         23 unsigned short in = 0;
         24 unsigned short out = 0;
         25 unsigned short produce_id = 0;
         26 unsigned short consume_id = 0;
         27 
         28 sem_t g_sem_full;
         29 sem_t g_sem_empty;
         30 
         31 pthread_mutex_t g_mutex;
         32 
         33 pthread_t g_thread[CONSUMER_COUNT+PRODUCE_COUNT];
         34 
         35 void* consume(void* arg)
         36 {
         37     int num= (int*)arg;
         38     int i;
         39     while(1)
         40     {
         41         printf("%d wait buffer not  empty
        ",num);
         42         sem_wait(&g_sem_empty);
         43         pthread_mutex_lock(&g_mutex);
         44     
         45         for(i = 0; i< BUFFSIZE; i++)
         46         {
         47             printf("%02d ",i);
         48             if(g_buffer[i] == -1)
         49                 printf("%s","null");
         50             else
         51                 printf("%d",g_buffer[i]);
         52             if(i == out)
         53                 printf("	<--consume");
         54             printf("
        ");
         55         }
         56 
         57         consume_id = g_buffer[out];
         58         printf("%d begin consume product %d
        ",num, consume_id);
         59         g_buffer[out] = -1;
         60         out = (out +  1)%BUFFSIZE;
         61         printf("%d end consume produce %d
        ",num,consume_id); 
         62 
         63         pthread_mutex_unlock(&g_mutex);
         64         sem_post(&g_sem_full);
         65         sleep(1);
         66     }
         67     return NULL;
         68 }
         69 
         70 void* produce(void* arg)
         71 {
         72     int num = (int*)arg;
         73     int i;
         74     while(1)
         75     {
         76         printf("%d wait buffer not full
        ",num);
         77         sem_wait(&g_sem_full);
         78         pthread_mutex_lock(&g_mutex);
         79     
         80         for(i = 0; i< BUFFSIZE; i++)
         81         {
         82             printf("%02d ",i);
         83             if(g_buffer[i] == -1)
         84                 printf("%s","null");
         85             else
         86                 printf("%d",g_buffer[i]);
         87             if(i == in)
         88                 printf("	<--produce");
         89             printf("
        ");
         90         }
         91 
         92         printf("%d begin produce product %d
        ",num, produce_id);
         93         g_buffer[in] = produce_id;
         94         in = (in +  1)%BUFFSIZE;
         95         printf("%d end produce produce %d
        ",num,produce_id++); 
         96         
         97         pthread_mutex_unlock(&g_mutex);
         98         sem_post(&g_sem_empty);
         99         sleep(1);
        100     }
        101     return NULL;
        102 }
        103 
        104 int main(void)
        105 {
        106     int i;
        107     for(i = 0; i < BUFFSIZE;i++)
        108         g_buffer[i] = -1;
        109     sem_init(&g_sem_full, 0, BUFFSIZE);
        110     sem_init(&g_sem_empty, 0, 0);
        111 
        112     pthread_mutex_init(&g_mutex,NULL);
        113 
        114     for(i = 0; i< CONSUMER_COUNT; i++)
        115     {
        116         pthread_create(&g_thread[i], NULL,consume, (void*)i);
        117     }
        118 
        119     for(i = 0; i< PRODUCE_COUNT; i++)
        120     {
        121         pthread_create(&g_thread[i], NULL,produce, (void*)i);
        122     }
        123 
        124     for(i = 0; i < CONSUMER_COUNT + PRODUCE_COUNT; i++)
        125     {
        126         pthread_join(g_thread[i],NULL);    
        127     }
        128 
        129 
        130     pthread_mutex_destroy(&g_mutex);
        131     sem_destroy(&g_sem_full);
        132     sem_destroy(&g_sem_empty);
        133 
        134 
        135     return 0;
        136 }
    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    Day 03
    Day 03 作业
    Day 02 作业
    Day 02
    Day 01
    Day 10 面向对象基础
    Spring学习-- Bean 的作用域
    一、基本知识
    cloud-init使用技巧
    如何在KVM中管理存储池
  • 原文地址:https://www.cnblogs.com/zhaohu/p/9033265.html
Copyright © 2020-2023  润新知