1. 程式人生 > >執行緒——條件變數

執行緒——條件變數

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

// 初始化互斥量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 條件變數
pthread_cond_t cond1;

// 資源
int source;

// 生產者
void *producer(void *v)
{
	while(1)
	{
		usleep(100000*(rand()%10+1));
		
		pthread_mutex_lock(&mutex);
		source += 2;

		pthread_mutex_unlock(&mutex);
		
		// 廣播
		pthread_cond_broadcast(&cond1);
	}
}

// 消費者
void *customer (void *v)
{
	long num = (long)v;
	
	while(1)
	{
		// 為什麼要有迴圈
		// 因為當執行緒被喚醒的時候,有可能條件還是不滿足的,所以還需要判斷一次
		// 1、當等待的時候,會自動解鎖
		// 2、當被喚醒的時候,會和其他執行緒一起搶鎖
		usleep(100000*(rand()%10+1));
		
		pthread_mutex_lock(&mutex);
		
		while (source <= 0)
		{
			pthread_cond_wait(&cond1, &mutex);
		}
		
		source--;
		printf ("%ld消費者消費,剩餘個數%d\n", num, source);
		
		pthread_mutex_unlock(&mutex);
	}
}

// 生產者與消費者
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);
	
	// pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr);
	// 條件變數的初始化
	pthread_cond_init(&cond1, NULL);

	pthread_exit(NULL);
	
	return 0;
}