1:有一个隧道,全长5公里,有2列火车,全长200米, 火车A时速 100公里每小时 火车B时速 50公里每小时 现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>
#include <wait.h>
#include <wait.h>
#include <pthread.h>
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;
void *train2(void *arg)
{
while(1){
pthread_mutex_lock(&mutex2);
int time2=(int)(5.4/50*60*60);
printf("火车B%d秒通过\n",time2);
sleep(time2/100);
pthread_mutex_unlock(&mutex1);
}
}
int main(int argc,const char *argv[])
{
pthread_mutex_init(&mutex1,NULL);
pthread_mutex_init(&mutex2,NULL);
pthread_t id;
pthread_create(&id,NULL,train2,NULL);
pthread_detach(id);
pthread_mutex_lock(&mutex2);
while(1)
{
pthread_mutex_lock(&mutex1);
int time1=(int)(5.4/100*60*60);
printf("火车A%d秒通过\n",time1);
pthread_mutex_unlock(&mutex2);
}
return 0;
}
2:有一个隧道,全长5公里,有3列火车,全长200米, 火车A时速 100公里每小时 火车B时速 50公里每小时 火车c时速 25公里每小时 现在要求 火车A先通过隧道,火车B再通过隧道,最后火车C通过隧道
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>
#include <semaphore.h>
pthread_mutex_t A;
pthread_mutex_t B;
pthread_mutex_t C;
void* trainA(void *str)
{
while(1)
{
pthread_mutex_lock(&A);
printf("火车A进入\n");
sleep(0.5);
puts("火车A驶出");
pthread_mutex_unlock(&B);
}
}
void* trainB(void *str)
{
while(1)
{
pthread_mutex_lock(&B);
printf("火车B进入\n");
sleep(1);
puts("火车B驶出");
pthread_mutex_unlock(&C);
}
}
void* trainC(void *str)
{
while(1)
{
pthread_mutex_lock(&C);
printf("火车C进入\n");
sleep(2);
puts("火车C驶出");
pthread_mutex_unlock(&A);
}
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&A,NULL);
pthread_mutex_init(&B,NULL);
pthread_mutex_init(&C,NULL);
pthread_mutex_lock(&B);
pthread_mutex_lock(&C);
pthread_t idA;
if(pthread_create(&idA,NULL,trainA,NULL) != 0)
{
perror("pthread_create");
return 1;
}
pthread_detach(idA);
pthread_t idB;
if(pthread_create(&idB,NULL,trainB,NULL) != 0)
{
perror("pthread_create");
return 1;
}
pthread_detach(idB);
pthread_t idC;
if(pthread_create(&idC,NULL,trainC,NULL) != 0)
{
perror("pthread_create");
return 1;
}
pthread_detach(idC);
while(1);
return 0;
}