资源简介

以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 使用命令cc consumer.c -o consumer编译

资源截图

代码片段和文件信息

/*
 * consumer.c
 *
 *  Created on: 2019年3月13日
 *      Author: WanQing
 */

#include 
#include 
#include 
#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);
} /*else if (b->writepos == b->readpos) {
 }*/
pthread_cond_signal(&b->notempty);
/* 写数据并移动指针 */
b->buffer[b->writepos] = data;
b->writepos++;
if (b->writepos >= BUFFER_SIZE)
b->writepos = 0;
/* 设置缓冲区非空的条件变量*/

pthread_mutex_unlock(&b->lock);
}
/* 从缓冲区中取出整数*/
int get(struct prodcons *

评论

共有 条评论