Синхронизация потоков с использованием семафора - PullRequest
0 голосов
/ 10 ноября 2019

У меня проблема с моим кодом. По сути, я пытаюсь выполнить многопоточность, используя семафор, но ожидаемый результат неверен. Я хотел бы получить помощь по моей проблеме. Сценарий: поток поезд моделирует поезд, который использует 1 секунду, чтобы пересечь дорогу, и новый поезд будет прибывать каждые 5 секунд. Поток движение моделирует движение автомобиля. В этот поток добавляется 1 секунда сна, чтобы предотвратить быстрый запуск бесконечного цикла , в то время как цикл .

sem_t gate;
void* train(void* arg){ 

while(1){

    printf("\n The railway gate is closed\n"); 

    //critical section 
    printf("\n The train is crossing\n");
    sleep(1);   //train crossing for 1 second

    printf("\n The railway gate is opened\n");      
    sem_post(&gate); // unlock signal
    sleep(5);   //the next train will arrive every 5 seconds
}
} 
void* car(void* arg) { 
while(1){
    sem_wait(&gate);
    printf("\n The cars are crossing the railway\n");
    sleep(1);                       
}} 


 int main() 
 { 
  //these values are used to identify thread number
int thread0_id=0, thread1_id=1; 

sem_init(&gate, 1, 1);

pthread_t t0,t1; 

//create three threads, passing thread number as the forth argument
pthread_create(&t0,NULL,car,&thread0_id); 
pthread_create(&t1,NULL,train,&thread1_id); 

//join two threads after they finished running
pthread_join(t0,NULL); 
pthread_join(t1,NULL); 
sem_destroy(&gate);
return 0; 
} 

Этот результат я получаю.

enter image description here

Это результат, которого я пытаюсь достичь.

enter image description here

...