阅读背景:

LInux线程条件变量、减少线程资源消耗_aa804738534的博客

来源:互联网 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define MAX_STOCK 20  //仓库容量
char g_storage[MAX_STOCK];
size_t g_stock=0;   //当前库存

//互斥量
pthread_mutex_t g_mtx=PTHREAD_MUTEX_INITIALIZER;

//条件变量
pthread_cond_t g_full=PTHREAD_COND_INITIALIZER;//满仓
pthread_cond_t g_empty=PTHREAD_COND_INITIALIZER;//空仓

//显示库存
void show(const char *who,const char *op,char prod)
{
	printf("%s:",who);
	size_t i;
	for(i=0;i<g_stock;++i)
		{
			printf("%c",g_storage[i]);
		}
	printf("%s%c\n",op,prod);
}

//生产者线程
void *produce(void *arg)
{
	const char *who=(const char*)arg;

	for(;;)
		{
			pthread_mutex_lock(&g_mtx);  //上锁,独享g_stock内部资源
			if(g_stock>=MAX_STOCK)  //生产数量大于20
				{
					
				printf("%s:OKOKOKOKOKOKOKOKOKOKOK\n",who);
				//pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)
				//函数中的第二个参数是一个互斥量,用于对条件变量保护
				//该函数会将调用线程阻塞在cond这个条件变量上,将它放在等待条件的线程列表中,
				//同时对互斥锁解锁,是的其它线程可以访问资源
				
				pthread_cond_wait(&g_full,&g_mtx);   //库存太多,生产太快,将生产者线程阻塞在满仓条件变量上。release mutex
		}
			char prod='A'+rand()%26;
			show(who,"<-",prod);
			g_storage[g_stock++]=prod;
			
			//pthread_cond_signal()用来给阻塞的线程发送信号来唤醒等待cond条件的线程。
			
			pthread_cond_signal(&g_empty);
			pthread_mutex_unlock(&g_mtx);
			usleep((rand()%100)*1000);
}
	return NULL;
}

//消费者线程
void *customer(void *arg)
{
	const char *who=(const char*)arg;

	for(;;)
		{
			pthread_mutex_lock(&g_mtx);  //上锁
			if(!g_stock)
				{
					printf("%s:NONONONONONONO!\n",who);
					pthread_cond_wait(&g_empty,&g_mtx);   //没库存,消费太快,将消费者线程堵塞在空仓条件变量上,
				}
			char prod=g_storage[--g_stock];
			show(who,"->",prod);
			pthread_cond_signal(&g_full);  //通知生产者可以进行生产了
			pthread_mutex_unlock(&g_mtx);	//解锁
			usleep((rand()%100)*1000);
		}
	return NULL;
}

int main()
{
	srand(time(NULL));
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	//对线程设置分离属性状态
	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
	pthread_t tid;
	pthread_create(&tid,&attr,produce,NULL);
	pthread_create(&tid,&attr,customer,NULL);
	getchar();

	return 0;
}
#include <stdio.h>
#include <string.h>
#include



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: