IO进程day6

一、思维导图

二、练习题1

        有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m 要求模拟这两列火车通过隧道的场景。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t m;
void Gao()
{
	sleep(1);
	pthread_mutex_lock(&m);
	printf("高铁通过隧道1000m/100m's=10s\n");
	pthread_mutex_unlock(&m);
}

void Kuai()
{
	pthread_mutex_lock(&m);
	printf("快车通过隧道1000m/50m's=20s\n");
	pthread_mutex_unlock(&m);
}

void* Train(void* arg)
{
	Kuai();
}

int main()
{
	pthread_mutex_init(&m, NULL);
	
	pthread_t id;
	pthread_create(&id, 0, Train, 0);
	pthread_detach(id);

	Gao();
	return 0;
}


二、练习题2

        有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m,有一辆慢车每秒25m 要求模拟这两列火车通过隧道的场景,但是要求高铁最先过隧道,快车其次,慢车最后。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t g;
pthread_mutex_t k;
pthread_mutex_t m;

void task_main()
{
	while(1)
	{	
		pthread_mutex_lock(&g);
		printf("高铁通过隧道\n");
		sleep(1);
		pthread_mutex_unlock(&k);
	}
}

void task1()
{
	while(1)
	{	
		pthread_mutex_lock(&k);
		printf("快车通过隧道\n");
		sleep(1);
		pthread_mutex_unlock(&m);
	}
}

void task2()
{
	while(1)
	{
		pthread_mutex_lock(&m);
		printf("慢车通过隧道\n");
		sleep(1);
		pthread_mutex_unlock(&g);
	}
}

void* thread_main1(void* arg)
{
	task1();
}

void* thread_main2(void* arg)
{
	task2();
}

int main()
{
	pthread_mutex_init(&g, NULL);
	pthread_mutex_init(&k, NULL);
	pthread_mutex_init(&m, NULL);
	pthread_mutex_lock(&k);
	pthread_mutex_lock(&m);

	pthread_t id;
	pthread_create(&id, 0, thread_main1, 0);
	pthread_detach(id);

	pthread_t id2;
	pthread_create(&id2, 0, thread_main2, 0);
	pthread_detach(id2);

	task_main();
	return 0;
}


三、练习题3

        使用条件变量实现一个生产者消费者模型(pv)模型

        生产者线程:每秒生成2个苹果

        消费者线程:每3秒消费 5~9个苹果

        要求:消费者在消费之前一定要有足够的苹果给消费。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>

int apple = 0;
int buy_apple = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;

void producer_task() //生产者
{
	while(1){
		pthread_mutex_lock(&mutex);
		apple += 2;
		printf("当前苹果库存:%d\n", apple);
	
		if(apple >= buy_apple){
			printf("唤醒消费者\n");
			pthread_cond_signal(&cond);
		}
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}

void consumer_task() //消费者
{
	while(1){
		pthread_mutex_lock(&mutex);
		//确定本次消费数量
		buy_apple = rand() % 5 + 5;
		printf("本次要消费%d个苹果\n", buy_apple);
		//为了保证每次apple>=buy_apple所以消费者需要等待,生产者通知消费者苹果数量足够消费
		pthread_cond_wait(&cond, &mutex);
		apple -= buy_apple;
		printf("当前剩余苹果数量为:%d\n", apple);

		pthread_mutex_unlock(&mutex);
		sleep(3);
	}
}

void* thread_main(void* arg)
{
	consumer_task();
}

int main()
{
	srand(time(0));
	pthread_mutex_init(&mutex, NULL);
	pthread_cond_init(&cond, NULL);

	pthread_t id;
	pthread_create(&id, NULL, thread_main, NULL);
	pthread_detach(id);

	producer_task();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值