//生产者消费者模型
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
//总共生产产品个数
#define PDT_SIZE 8
//生产者个数
#define PRO_SIZE 1
//消费者个数
#define CON_SIZE 2
//缓冲区个数
#define BUFFER_SIZE 4
//生产者线程
void *thrd_pro(void *arg);
//消费者线程
void *thrd_con(void *arg);
//缓冲区
int g_buffer[BUFFER_SIZE];
//生产者者访问缓冲区索引(打输出信息用)
int g_i;
//消费者访问缓冲区索引(打输出信息用)
int g_j;
//某个消费者发现了最后一件产品,通知其它消费者停止工作
int g_end;
//缓冲区非空个数信号量
sem_t sem_hasdata;
//缓冲区为空个数信号量
sem_t sem_nodata;
//缓冲区访问互斥
pthread_mutex_t mutex;
int main()
{
printf("***********Process is start! Create by xujiali!***********\n");
printf("There are %d Producters, %d Constumers and %d buffer spaces!\n", PRO_SIZE, CON_SIZE, BUFFER_SIZE);
//初始化缓冲区互斥量
pthread_mutex_init(&mutex, 0);
//缓冲区非空个数信号量的初值为0
sem_init(&sem_hasdata,0,0);
//缓冲区为空个数信号量的初值为4
sem_init(&sem_nodata,0,BUFFER_SIZE);
//生产者线程
pthread_t pro_thread[PRO_SIZE];
// 创建生产者线程
int pro_no;
for(pro_no = 0; pro_no < PRO_SIZE; ++pro_no)
{
if (pthread_create(&pro_thread[pro_no],NULL,thrd_pro,(void*)pro_no) != 0)
printf("Create pro_thread %d success!\n",pro_no);
}
//消费者线程
pthread_t con_thread[CON_SIZE];
// 创建消费者线程
int con_no;
for(con_no = 0; con_no < CON_SIZE; ++con_no)
{
if (pthread_create(&con_thread[con_no],NULL,thrd_con,(void*)con_no) != 0)
printf("Create con_thread %d success!\n",con_no);
}
// 逐个join掉生产者线程
void *tret;
int i;
for(i = 0;i < PRO_SIZE; ++i){
if (pthread_join(pro_thread[i],&tret) == 0)
printf("Join pro_thread %d success!\n",i);
}
// 逐个join掉消费者线程
int j;
for(j = 0;j < CON_SIZE; ++j){
if (pthread_join(con_thread[j],&tret) == 0)
printf("Join con_thread %d success!\n",j);
}
//干掉信号量
sem_destroy(&sem_hasdata);
sem_destroy(&sem_nodata);
//干掉互斥量
pthread_mutex_destroy(&mutex);
printf("***********Process is end! Create by xujiali!***********\n");
return 0;
}
//生产者线程
void *thrd_pro(void *arg)
{
int thrd_num = (void*)arg;
printf("Pro Thread %d is starting.\n",thrd_num);
int count;
for(count = 1; count <= PDT_SIZE; ++count)
{
//为空信号量P操作
sem_wait(&sem_nodata);
//锁缓冲区
pthread_mutex_lock(&mutex);
g_buffer[g_i] = count;
printf(" Pro Thread: %d at buffer index :%d insert data: %d\n", thrd_num, g_i, g_buffer[g_i]);
//采用循环队列的方式维护缓冲区
g_i = (g_i + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
//非空信号量V操作
sem_post(&sem_hasdata);
}
printf("Pro Thread %d is exiting.\n",thrd_num);
pthread_exit(NULL);
}
//消费者线程
void *thrd_con(void *arg)
{
int thrd_num = (void*)arg;
printf("Con Thread %d is starting.\n",thrd_num);
while(1)
{
//非空信号量P操作
sem_wait(&sem_hasdata);
//锁缓冲区
pthread_mutex_lock(&mutex);
if (!g_end)
{
printf(" Con Thread: %d from buffer index: %d get data:%d.\n", thrd_num, g_j, g_buffer[g_j]);
}
else
{
printf(" Con Thread: %d recv notic \"have no products\".\n", thrd_num);
}
//最后一件产品被消费
if (g_buffer[g_j] == PDT_SIZE)
{
pthread_mutex_unlock(&mutex);
//非空信号量V操作(通知其它消费者线程结束)
g_end = 1;
sem_post(&sem_hasdata);
break;
}
g_j = (g_j + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
//为空信号量V操作
sem_post(&sem_nodata);
}
printf("Con Thread %d is exiting.\n",thrd_num);
pthread_exit(NULL);
}
输出:
[db2inst1@RHEL6 study]$ ./08pthread_producter_consumer_utf8
***********Process is start! Create by xujiali!***********
There are 1 Producters, 2 Constumers and 4 buffer spaces!
Pro Thread 0 is starting.
Pro Thread: 0 at buffer index :0 insert data: 1
Pro Thread: 0 at buffer index :1 insert data: 2
Pro Thread: 0 at buffer index :2 insert data: 3
Pro Thread: 0 at buffer index :3 insert data: 4
Con Thread 0 is starting.
Con Thread: 0 from buffer index: 0 get data:1.
Con Thread: 0 from buffer index: 1 get data:2.
Con Thread: 0 from buffer index: 2 get data:3.
Con Thread: 0 from buffer index: 3 get data:4.
Pro Thread: 0 at buffer index :0 insert data: 5
Con Thread 1 is starting.
Con Thread: 1 from buffer index: 0 get data:5.
Pro Thread: 0 at buffer index :1 insert data: 6
Pro Thread: 0 at buffer index :2 insert data: 7
Con Thread: 0 from buffer index: 1 get data:6.
Con Thread: 1 from buffer index: 2 get data:7.
Pro Thread: 0 at buffer index :3 insert data: 8
Pro Thread 0 is exiting.
Con Thread: 0 from buffer index: 3 get data:8.
Con Thread: 1 recv notic "have no products".
Con Thread 1 is exiting.
Con Thread 0 is exiting.
Join con_thread 1 success!
***********Process is end! Create by xujiali!***********