1:有一个隧道,全长5公里,有2列火车,全长200米,
火车A时速 100公里每小时
火车B时速 50公里每小时
现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
pthread_mutex_t mutex_a;
pthread_mutex_t mutex_b;
void* run1(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex_a);
printf("火车A进入隧道\n");
for(int i=0;i<5200;i++)
{
usleep(100);
}
printf("火车A驶出隧道\n");
pthread_mutex_unlock(&mutex_a);
}
}
int main(int argc, const char *argv[])
{
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex_a,NULL);
pthread_mutex_init(&mutex_b,NULL);
if(pthread_create(&id1,0,run1,0) != 0 )
{
perror("pthread_create_A");
return 1;
}
pthread_detach(id1);
while(1)
{
pthread_mutex_lock(&mutex_b);
printf("火车B进入隧道\n");
for(int i=0;i<5200*2;i++)
{
usleep(100);
}
printf("火车B驶出隧道\n");
pthread_mutex_unlock(&mutex_b);
}
return 0;
}
2 2:有一个隧道,全长5公里,有3列火车,全长200米,
火车A时速 100公里每小时
火车B时速 50公里每小时
火车c时速 25公里每小时
现在要求 火车A先通过隧道,火车B再通过隧道,最后火车C通过隧道
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t con_a;
pthread_cond_t con_b;
pthread_cond_t con_c;
int flag = 0;
void* run1(void* arg)
{
while(1)
{
while(0 != flag ){pthread_cond_wait(&con_a,&mutex);}
printf("火车A进入隧道\n");
for(int i=0;i<5200;i++)
{
usleep(100);
}
printf("火车A驶出隧道\n");
flag = 1;
pthread_cond_signal(&con_b);
pthread_mutex_unlock(&mutex);
}
}
void* run2(void* arg)
{
while(1)
{
while(1 != flag ){pthread_cond_wait(&con_b,&mutex);}
printf("火车B进入隧道\n");
for(int i=0;i<5200*2;i++)
{
usleep(100);
}
printf("火车B驶出隧道\n");
flag = 2;
pthread_cond_signal(&con_c);
pthread_mutex_unlock(&mutex);
}
}
void* run3(void* arg)
{
while(1)
{
while(2 != flag ){pthread_cond_wait(&con_c,&mutex);}
printf("火车C进入隧道\n");
for(int i=0;i<5200*4;i++)
{
usleep(100);
}
printf("火车C驶出隧道\n");
flag = 0;
pthread_cond_signal(&con_a);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&con_a,NULL);
pthread_cond_init(&con_b,NULL);
pthread_cond_init(&con_c,NULL);
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
if(pthread_create(&thread1,0,run1,0) != 0)
{
perror("pthread_create");
return 1;
}
if(pthread_create(&thread2,0,run2,0) != 0)
{
perror("pthread_create");
return 2;
}
if(pthread_create(&thread3,0,run3,0) != 0)
{
perror("pthread_create");
return 3;
}
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
pthread_join(thread3,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&con_a);
pthread_cond_destroy(&con_b);
pthread_cond_destroy(&con_c);
return 0;
}