Linux下c语言多线程实现生产者-消费者问题
利用循环队列实现资源池,生产者和消费者互斥的进行访问,关键是要定义好资源池的属性,定义如下:
struct prodcons { int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos, writepos; pthread_cond_t notempty; pthread_cond_t notfull; };
5个属性表示的含义分别是:
资源池空间、互斥锁、生产者和消费者position、资源池空和满的条件变量
实现的代码如下:
/************************************************************************* > File Name: pro_cus.c > Author: xiao5 > Mail: xiao5_zju@163.com > Created Time: Mon 13 Jun 2016 10:31:34 AM CST ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<pthread.h> #define BUFFER_SIZE 10 struct prodcons { int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos, writepos; pthread_cond_t notempty; pthread_cond_t notfull; }; void init(struct prodcons *b) { printf("Starting init the struct Prodcons!\n"); sleep(1); 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); while(((b->writepos+1) % BUFFER_SIZE == b->readpos)) { printf("队列已满,等待消费者消费产品......\n"); 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); while(b->writepos == b->readpos) { printf("队列中没有产品,等待生产者生产......\n"); 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; } #define OVER -1 struct prodcons buffer; void *producer(void *data) { int n; for(n=0; n<30; n++) { printf("Start put %d\t", n); put(&buffer, n); printf("Put --> %d finidhed!\n", n); } put(&buffer, OVER); printf("Producer finish the job!\n"); return NULL; } void *consumer(void *data) { int d = -1; while(1) { printf("Start get %d\t", ++d); d = get(&buffer); printf("%d --> get finished!\n", d); if(d == OVER) break; } printf("Consumer finish the job!\n"); return NULL; } int main() { pthread_t tha, thb; void * retval; init(&buffer); pthread_create(&tha, NULL, producer, 0); pthread_create(&thb, NULL, consumer, 0); pthread_join(tha, &retval); pthread_join(thb, &retval); return 0; }
实现的结果如下:
相关推荐
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
三个多线程经典代码只需要5分 转别人的,没分下载了 混点分,请多多支持
线程如何去创建 ,多线程如何控制输出!互斥控制!
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
linux下C语言多线程编程实例.pdf
对Linux下C语言编程--线程操作作了详细的说明
以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...
在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。
windows环境下C语言多线程实现网络编程,多人聊天室,[总结].pdf
统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。 本文我们将介绍在Linux 下编写多进程和多线程程序的一些初步知识。 1 引言 对于没有接触过 Unix/Linux 操作系统的人来说,fork ...
Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念
linux c语言 多线程 网页爬虫 spider
30本全部奉献(6):Linux C语言编程一站式学习--pdf完整版
C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
c语言多进程多线程编程
linux下C语言多线程编程实例.docx
linux下C语言多线程编程实例.doc