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