互斥锁应用实例

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

此实例已解决:库存数量num小于线程个数出现负数的问题

#include 
#include 
#include 
#include 
#include 

int num=5;												//定义变量表示库存

pthread_t id1,id2,id3,id4;
pthread_mutex_t mymutex;								//定义互斥锁
pthread_cond_t mycond;									//定义条件变量
	
void finish(int num)
{
	pthread_mutex_destroy(&mymutex);					//销毁锁
	pthread_cancel(id1);								//取消四个子线程
	pthread_cancel(id2);
	pthread_cancel(id3);
	pthread_cancel(id4);
	exit(0);
}

void *sale1(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mymutex);
		if(num <= 0)
		{
			printf("阻塞在wait这个位置了!\n");
			pthread_cond_wait(&mycond,&mymutex); 		//解除阻塞后从此处开始往下运行
			pthread_mutex_unlock(&mymutex);				//解锁操作,防止重复上锁造成堵塞
			continue;									//跳出此次循环,重新上锁再进行num值的判断
		}	
		num--;
		
		printf("销售一部卖出一件产品,剩下:%d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		sleep(1);
	}
}

void *sale2(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mymutex);
		if(num <= 0)
		{
			printf("阻塞在wait这个位置了!\n");
			pthread_cond_wait(&mycond,&mymutex); 		//解除阻塞后从此处开始往下运行
			pthread_mutex_unlock(&mymutex);				//解锁操作,防止重复上锁造成堵塞
			continue;									//跳出此次循环,重新上锁再进行num值的判断
		}
		num--;
		
		printf("销售二部卖出一件产品,剩下:%d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		sleep(1);
	}
}

void *sale3(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mymutex);
		if(num <= 0)
		{
			printf("阻塞在wait这个位置了!\n");			
			pthread_cond_wait(&mycond,&mymutex); 		//解除阻塞后从此处开始往下运行
			pthread_mutex_unlock(&mymutex);				//解锁操作,防止重复上锁造成堵塞
			continue;									//跳出此次循环,重新上锁再进行num值的判断
		}
		num--;
		
		printf("销售三部卖出一件产品,剩下:%d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		sleep(1);
	}
}

void *sale4(void *arg)
{
	while(1)
	{	
		pthread_mutex_lock(&mymutex);
		if(num <= 0)
		{
			printf("阻塞在wait这个位置了!\n");
			pthread_cond_wait(&mycond,&mymutex); 		//解除阻塞后从此处开始往下运行
			pthread_mutex_unlock(&mymutex);				//解锁操作,防止重复上锁造成堵塞
			continue;									//跳出此次循环,重新上锁再进行num值的判断
		}
		
		num--;
		printf("销售四部卖出一件产品,剩下:%d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		sleep(1);
	}
}

int main()
{
	signal(SIGINT,finish);
	
	pthread_mutex_init(&mymutex,NULL);					//初始化锁
	pthread_cond_init(&mycond,NULL);					//初始化条件变量
	
	pthread_create(&id1,NULL,sale1,NULL);				//创建四个线程分别表示四个销售部门
	pthread_create(&id2,NULL,sale2,NULL);
	pthread_create(&id3,NULL,sale3,NULL);
	pthread_create(&id4,NULL,sale4,NULL);
	

	while(1)											//生产部门
	{
		if(num == 0)
		{
			printf("产品已售完,请生产\n");
			scanf("%d",&num);
			pthread_cond_broadcast(&mycond);			//解除所有线程的阻塞状态
		}
	}
	return 0;
}

运行结果:
互斥锁应用实例_第1张图片

你可能感兴趣的:(系统编程)