1. 程式人生 > >執行緒——生產者與消費者1.0

執行緒——生產者與消費者1.0

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>

// 定義結構體變數
// 全域性資料
struct _data
{
	// 緩衝區中的資料
	char buf[20];
	// 控制消費者進入
	sem_t full;
	// 控制生產者進入	
	sem_t empty;
}data;

// 生產者工作函式
void *producer(void *v)
{
	char *buf[] = {"蘋果", "梨", "波羅蜜", "山竹"};
	int len = sizeof(buf) / sizeof(buf[0]);
	
	while(1)
	{
		// 生產者只有當緩衝區為空的時候才能進入
		sem_wait(&data.empty);
		
		usleep(100000*(rand()%10+1));
		strcpy(data.buf, buf[rand()%len]);
		
		// 生產者放入訊息以後,通知消費者去處理
		sem_post(&data.full);
	}
}

// 消費者工作函式
void *customer (void *v)
{
	long num = (long)v;
	
	while(1)
	{
		// 消費者只有當緩衝區中有資料的時候才能進入
		sem_wait(&data.full);
		
		usleep(100000*(rand()%10+1));
		printf ("%ld 消費者吃了一個 %s\n", num, data.buf);
		data.buf[0] = '\0';
		
		// 消費者處理完資料以後,通知生產者去放資料
		sem_post(&data.empty);
	}
}

// 生產者與消費者
int main()
{
	srand((unsigned int)time(NULL));
	
	pthread_t thread;
	
	long i;
	
	for (i = 0; i < 4; i++)
	{
		pthread_create(&thread, NULL, customer, (void *)(i+1));
		pthread_detach(thread);
	}
	
	pthread_create(&thread, NULL, producer, NULL);
	pthread_detach(thread);
	
	// int sem_init(sem_t *sem, int pshared, unsigned int value);
	sem_init(&data.full, 0, 0);
	sem_init(&data.empty, 0, 1);
	
	pthread_exit(NULL);
	
	return 0;
}