linux 多线程【2】条件变量

条件变量:一个生产者,一个消费者,生产者将变量++,消费者将变量--,但是消费者只能在变量>0时才能--,生产者只能在变量<10时才++。


//thread.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>

void *func1(void *);
void *func2(void *);

int g_a=0;
pthread_mutex_t pt;
pthread_cond_t ct;
pthread_cond_t ct2;

int main()
{
	pthread_t pt1,pt2;

	// init
	pthread_mutex_init(&pt, NULL);
        pthread_cond_init(&ct,NULL);
        pthread_cond_init(&ct2,NULL);

	//start sub thread
	pthread_create(&pt1, NULL, func1, NULL);
	pthread_create(&pt2, NULL, func2, NULL);

	pthread_join(pt1,NULL);
	pthread_join(pt2,NULL);

	// destroy
	pthread_mutex_destroy(&pt);
	pthread_cond_destroy(&ct);
	pthread_cond_destroy(&ct2);
	return 0;
}


//生产者
void *func1(void*d)
{
	while(1)
	{
		// 获得锁
		while(pthread_mutex_trylock(&pt)!=0)
		{
			printf("EBUSY\n");
		}
		
		// 大于10,则释放锁,让消费者进程来减少g_a的取值
		if(g_a>=10)
			pthread_cond_wait(&ct2, &pt);
		// ++
		g_a++;
		printf("produce one; g_a = %d\n", g_a);                                                                                                                                                                    
			
		//大于0时通知消费者线程,可以消费了。
		pthread_mutex_unlock(&pt);
                if(g_a>0)
			pthread_cond_signal(&ct);
	}	
	return NULL;
}

//消费者
void *func2(void*d)
{
	while(1)
	{
		//获得锁
		while(pthread_mutex_trylock(&pt)!=0)
		{
			printf("EBUSY\n");
		}

		// g_a>0才可以消费
		if(g_a<=0)
			pthread_cond_wait(&ct, &pt);
		
		g_a--;
		printf("eat one; g_a = %d\n", g_a);

		//释放锁
		pthread_mutex_unlock(&pt);

		//<10时通知生产者线程,可以生产了!
		if(g_a<10)
			pthread_cond_signal(&ct2);
	
	}	
	return NULL;
}



执行结果:

administrator@ubuntu:~/test$ gcc thread.c -lpthread -o p

produce one; g_a = 1
produce one; g_a = 2
produce one; g_a = 3
produce one; g_a = 4
produce one; g_a = 5
produce one; g_a = 6
produce one; g_a = 7
produce one; g_a = 8
produce one; g_a = 9
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
eat one; g_a = 8
eat one; g_a = 7
eat one; g_a = 6
eat one; g_a = 5
eat one; g_a = 4
eat one; g_a = 3
eat one; g_a = 2
eat one; g_a = 1
eat one; g_a = 0
produce one; g_a = 1
produce one; g_a = 2
produce one; g_a = 3
produce one; g_a = 4
produce one; g_a = 5
produce one; g_a = 6
produce one; g_a = 7
produce one; g_a = 8
produce one; g_a = 9
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
eat one; g_a = 8
EBUSY
eat one; g_a = 7
EBUSY
eat one; g_a = 6
produce one; g_a = 7
EBUSY
produce one; g_a = 8
produce one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
eat one; g_a = 8
eat one; g_a = 7
eat one; g_a = 6
eat one; g_a = 5
eat one; g_a = 4
eat one; g_a = 3
eat one; g_a = 2
eat one; g_a = 1
eat one; g_a = 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值