zoukankan      html  css  js  c++  java
  • 生产者和消费者

    #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 < 10000; n++)
        {
            printf("%d --->
    ", 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("--->%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;
    }
    

      

  • 相关阅读:
    HDevEngine in .NET Applications MultiThreading
    C# 打开以对话框,获取文件夹路径 、文件的路径、文件名
    C#设计模式总结
    C#使用Aspose.Cells导出Excel简单实现
    [相机选型] 双目视觉系统的器材选型和搭建
    08 Django组件-Forms组件
    MySql数据库基础知识
    MySql数据库多表操作
    补充01 Django 类视图
    07 Django组件-中间件
  • 原文地址:https://www.cnblogs.com/xiatian1071/p/3640689.html
Copyright © 2011-2022 走看看