Многопоточные семафоры, использующие C

#c #operating-system #semaphore

Вопрос:

Я хочу убедиться, что я поступил правильно в соответствии с данным вопросом. вопрос в том, чтобы сделать простую серию программ, которая выводит на экран следующую строку — «Я люблю класс ОС». Для этого у нас будет 4 процесса, каждый из которых будет печатать только 1 слово. мы запустим их все, и они будут ждать соответствующего сигнала от правильного процесса. Процесс, который печатает «класс», будет ждать, когда процесс, который печатает «ОС», подаст сигнал об этом, процесс печати «ОС» будет ждать процесса «любовь», а процесс «любовь» будет ждать процесса «Я».

Я придумал следующий код, но я не уверен, правильна ли моя логика или нет.

 #include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t mutex;

void* thread(void* arg){
  //wait
  sem_wait(amp;mutex);
  printf("I n");

  //wait
  sleep(2);
  
  //critical section
  sem_post(amp;mutex);
  printf("Love n");
  
  //wait
  sem_wait(amp;mutex);
  printf("OS n");
  
  //critical section
  sleep(2);
  sem_post(amp;mutex);
  printf("Class n");
  

}

int main(){
   sem_init(amp;mutex, 0, 1);
   
    pthread_t t1,t2,t3,t4;
    
    pthread_create(amp;t1,NULL,thread,NULL);
    sleep(2);
    pthread_create(amp;t2,NULL,thread,NULL);
    pthread_create(amp;t3,NULL,thread,NULL);
    sleep(2);
    pthread_create(amp;t4,NULL,thread,NULL);
    
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    pthread_join(t3,NULL);
    pthread_join(t4,NULL);
    
    sem_destroy(amp;mutex);
    return 0;
}
 

мои выходные данные показывают:

 I 
Love 
I 
Love 
OS 
Class 
I 
Love 
OS 
Class 
I 
Love 
OS 
Class 
OS 
Class
 

Комментарии:

1. Итак, что показало ваше тестирование?

2. Как написано, каждый поток будет печатать каждую строку, так как if в функции потока нет никакой функции. Операции семафора влияют только на то, когда код выполняется этим потоком, а не на то, выполняется ли он.

3. @kaylum я обновил свой вывод.

4. но я не уверен, верна ли моя логика или нет . Тогда вы должны быть в состоянии ответить на этот вопрос сами. Вывод-это не то, что вы хотите, поэтому очевидно, что логика неверна.

5. О, это неправильно — у него есть вызовы сна() без уважительной причины. Чтобы сериализовать четыре потока в определенном порядке, вам понадобятся три семафора.