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;
}