#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. О, это неправильно — у него есть вызовы сна() без уважительной причины. Чтобы сериализовать четыре потока в определенном порядке, вам понадобятся три семафора.