zoukankan      html  css  js  c++  java
  • 一个经典的消费者和生产者的实现(linux )

    #include <stdio.h>  
    #include <pthread.h>  
    #define BUFFER_SIZE 16 // 缓冲区数量  
        struct prodcons  
        {  
            // 缓冲区相关数据结构  
            int buffer[BUFFER_SIZE]; /* 实际数据存放的数组*/  
            pthread_mutex_t lock; /* 相互排斥体lock 用于对缓冲区的相互排斥操作 */  
            int readpos, writepos; /* 读写指针*/  
            pthread_cond_t notempty; /* 缓冲区非空的条件变量 */  
            pthread_cond_t notfull; /* 缓冲区未满的条件变量 */  
        };  
        /* 初始化缓冲区结构 */  
        void init(struct prodcons *b)  
        {  
            pthread_mutex_init(&b->lock, NULL);  
            pthread_cond_init(&b->notempty, NULL);  
            pthread_cond_init(&b->notfull, NULL);  
            b->readpos = 0;  
            b->writepos = 0;  
        }  
        /* 将产品放入缓冲区,这里是存入一个整数*/  
        void put(struct prodcons *b, int data)  
        {  
            pthread_mutex_lock(&b->lock);  
            /* 等待缓冲区未满*/  
            if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)  
            {  
                pthread_cond_wait(&b->notfull, &b->lock);  
            }  
            /* 写数据,并移动指针 */  
            b->buffer[b->writepos] = data;  
            b->writepos++;  
            if (b->writepos >= BUFFER_SIZE)  
                b->writepos = 0;  
            /* 设置缓冲区非空的条件变量*/  
            pthread_cond_signal(&b->notempty);  
            pthread_mutex_unlock(&b->lock);  
        }   
        /* 从缓冲区中取出整数*/  
        int get(struct prodcons *b)  
        {  
            int data;  
            pthread_mutex_lock(&b->lock);  
            /* 等待缓冲区非空*/  
            if (b->writepos == b->readpos)  
            {  
                pthread_cond_wait(&b->notempty, &b->lock);  
            }  
            /* 读数据,移动读指针*/  
            data = b->buffer[b->readpos];  
            b->readpos++;  
            if (b->readpos >= BUFFER_SIZE)  
                b->readpos = 0;  
            /* 设置缓冲区未满的条件变量*/  
            pthread_cond_signal(&b->notfull);  
            pthread_mutex_unlock(&b->lock);  
            return data;  
        }  
          
          
        /* 測试:生产者线程将1 到10000 的整数送入缓冲区,消费者线
           程从缓冲区中获取整数,两者都信息打印*/  
        #define OVER ( - 1)  
        struct prodcons buffer;  
        void *producer(void *data)  
        {  
            int n;  
            for (n = 0; n < 50; n++)  
            {  
                printf("%d ---producer==> ", n);  
                put(&buffer, n);  
            } put(&buffer, OVER);  
            return NULL;  
        }  
          
          
        void *consumer(void *data)  
        {  
            int d;  
            while (1)  
            {  
                d = get(&buffer);  
                if (d == OVER)  
                    break;  
                printf("---consumer==>%d ", d);  
            }  
            return NULL;  
        }  
          
          
        int main(void)  
        {  
            pthread_t th_a, th_b;  
            void *retval;  
            init(&buffer);  
            /* 创建生产者和消费者线程*/  
            pthread_create(&th_a, NULL, producer, 0);  
            pthread_create(&th_b, NULL, consumer, 0);  
            /* 等待两个线程结束*/  
            pthread_join(th_a, &retval);  
            pthread_join(th_b, &retval);  
            return 0;  
        } 
  • 相关阅读:
    linux mysql添加用户
    linux mysql为root用户初始化密码和改变root密码
    linux pts/0的含义
    mysql查看表的结构
    linux踢人命令 pkill踢人用法
    linux查看在线用户 who命令参数及用法
    linux mysql数据库安装(tar.gz)
    vue app外卖(5) 使用swiper 进行图片轮播
    element-UI 点击一行,背景色变化
    vue 外卖app(3) 利用slot分发内容
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6848889.html
Copyright © 2011-2022 走看看