io240511

1:有一个隧道,全长5公里,有2列火车,全长200米,
                火车A时速 100公里每小时
                火车B时速 50公里每小时
                现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行)

int SuiDao_len=5000; //隧道长度(单位 米)
int train_len=200;  //火车长度(单位 米)
pthread_mutex_t mutex;  //创建 互斥锁变量
pthread_cond_t cond;  //创建 条件变量

void* run1(void*arg){
	pthread_mutex_lock(&mutex);  //上锁 互斥锁
	pthread_cond_wait(&cond,&mutex);  //线程 立刻阻塞 等待唤醒
	float train_SuDu=100*1000/3600.0;  //100公里换算成 米,1小时换算成 秒,得到每秒走多少米,有小数点
	int sum_len=SuiDao_len+train_len;  //火车长度 加 隧道长度 得到 总长度
	unsigned int train_time=sum_len/train_SuDu;  //总长度 / 每秒走多少米 得到 用时多少秒
	printf("需要用时%d秒,除10加速通过\n",train_time);
	printf("火车A\n正在每小时100公里的速度通过\n");
	sleep(train_time/10);  //休眠多少秒后,给结果
	printf("火车A\n已经通过\n");
	sleep(1);
	pthread_mutex_unlock(&mutex);  //解锁运行
}
void* run2(void*arg){
	pthread_mutex_lock(&mutex);  //上锁 互斥锁
	pthread_cond_wait(&cond,&mutex);  //线程 立刻阻塞 等待唤醒
	float train_SuDu=50*1000/3600.0;  //100公里换算成 米,1小时换算成 秒,得到每秒走多少米,有小数点
	int sum_len=SuiDao_len+train_len;  //火车长度 加 隧道长度 得到 总长度
	unsigned int train_time=sum_len/train_SuDu;  //总长度 / 每秒走多少米 得到 用时多少秒
	printf("需要用时%d秒,除10加速通过\n",train_time);
	printf("火车B\n正在每小时50公里的速度通过\n");
	sleep(train_time/10);  //休眠多少秒后,给结果
	printf("火车B\n已经通过\n");
	sleep(1);
	pthread_mutex_unlock(&mutex);  //解锁运行
}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&mutex,0);  //初始化条件属性0
	pthread_cond_init(&cond,0);  //初始化条件属性0
	pthread_t id1;  //创建一个线程 id1
	pthread_t id2;  //创建一个线程 id2

	if(pthread_create(&id1,0,run1,0)!=0){  //初始化 线程id1 运行run1函数,并判断错误
		perror("pthread_create_1");
		return 1;
	}
	if(pthread_create(&id2,0,run2,0)!=0){  //初始化 线程id2 运行run2函数,并判断错误
		perror("pthread_create_2");
		return 2;
	}

	pthread_detach(id1);  //线程设置成分离式线程
	pthread_detach(id2);  //线程设置成分离式线程

	while(1){
		pthread_cond_signal(&cond);  //唤醒等待中的线程,至少1个线程
		sleep(1);

	}

	return 0;
}

2:有一个隧道,全长5公里,有3列火车,全长200米,
                火车A时速 100公里每小时
                火车B时速 50公里每小时
                火车C时速 25公里每小时
                现在要求 火车A先通过隧道,火车B再通过隧道,最后火车C通过隧道

int SuiDao_len=5000; //隧道长度(单位 米)
int train_len=200;  //火车长度(单位 米)
pthread_mutex_t mutex1;  //创建 互斥锁变量1
pthread_mutex_t mutex2;  //创建 互斥锁变量2
pthread_mutex_t mutex3;  //创建 互斥锁变量3

pthread_cond_t cond;  //创建 条件变量


void* run1(void*arg){
	pthread_mutex_lock(&mutex1);  //上锁 互斥锁
	pthread_cond_wait(&cond,&mutex1);  //线程 立刻阻塞 等待唤醒
	float train_SuDu=100*1000/3600.0;  //100公里换算成 米,1小时换算成 秒,得到每秒走多少米,有小数点
	int sum_len=SuiDao_len+train_len;  //火车长度 加 隧道长度 得到 总长度
	unsigned int train_time=sum_len/train_SuDu;  //总长度 / 每秒走多少米 得到 用时多少秒
	printf("需要用时%d秒,除10加速通过\n",train_time);
	printf("火车A\n正在每小时100公里的速度通过\n");
	sleep(train_time/10);  //休眠多少秒后,给结果
	printf("火车A\n已经通过\n");
	sleep(1);
	pthread_mutex_unlock(&mutex2);  //解锁运行
}
void* run2(void*arg){
	pthread_mutex_lock(&mutex2);  //上锁 互斥锁
	pthread_cond_wait(&cond,&mutex2);  //线程 立刻阻塞 等待唤醒
	float train_SuDu=50*1000/3600.0;  //50公里换算成 米,1小时换算成 秒,得到每秒走多少米,有小数点
	int sum_len=SuiDao_len+train_len;  //火车长度 加 隧道长度 得到 总长度
	unsigned int train_time=sum_len/train_SuDu;  //总长度 / 每秒走多少米 得到 用时多少秒
	printf("需要用时%d秒,除10加速通过\n",train_time);
	printf("火车B\n正在每小时50公里的速度通过\n");
	sleep(train_time/10);  //休眠多少秒后,给结果
	printf("火车B\n已经通过\n");
	sleep(1);
	pthread_mutex_unlock(&mutex3);  //解锁运行
}
void* run3(void*arg){
	pthread_mutex_lock(&mutex3);  //上锁 互斥锁
	pthread_cond_wait(&cond,&mutex3);  //线程 立刻阻塞 等待唤醒
	float train_SuDu=15*1000/3600.0;  //15公里换算成 米,1小时换算成 秒,得到每秒走多少米,有小数点
	int sum_len=SuiDao_len+train_len;  //火车长度 加 隧道长度 得到 总长度
	unsigned int train_time=sum_len/train_SuDu;  //总长度 / 每秒走多少米 得到 用时多少秒
	printf("需要用时%d秒,除10加速通过\n",train_time);
	printf("火车C\n正在每小时50公里的速度通过\n");
	sleep(train_time/10);  //休眠多少秒后,给结果
	printf("火车C\n已经通过\n");
	sleep(1);
	exit(0);
}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&mutex1,0);  //初始化条件属性0
	pthread_mutex_init(&mutex2,0);  //初始化条件属性0
	pthread_mutex_init(&mutex3,0);  //初始化条件属性0
	pthread_t id1;  //创建一个线程 id1
	pthread_t id2;  //创建一个线程 id2
	pthread_t id3;  //创建一个线程 id3

	if(pthread_create(&id1,0,run1,0)!=0){  //初始化 线程id1 运行run1函数,并判断错误
		perror("pthread_create_1");
		return 1;
	}
	if(pthread_create(&id2,0,run2,0)!=0){  //初始化 线程id2 运行run2函数,并判断错误
		perror("pthread_create_2");
		return 2;
	}
	if(pthread_create(&id3,0,run3,0)!=0){  //初始化 线程id3 运行run2函数,并判断错误
		perror("pthread_create_3");
		return 2;
	}

	pthread_mutex_lock(&mutex2);  //先锁,锁2 不给解锁不运行
	pthread_mutex_lock(&mutex3);  //先锁,锁2 不给解锁不运行

	pthread_detach(id1);  //线程设置成分离式线程
	pthread_detach(id2);  //线程设置成分离式线程
	pthread_detach(id3);  //线程设置成分离式线程

	while(1){
		pthread_cond_signal(&cond);  //唤醒等待中的线程,至少1个线程
		sleep(1);

	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值