C программа для печати предложения с использованием потоков и семафоров с бесконечным циклом - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время я пытаюсь создать программу, которая будет печатать фразу «Какой чудесный мир» с использованием трех потоков. Первый поток должен печатать «What A», второй «Wonderful», а третий «World» навсегда. Все это должно быть синхронизировано с семпахорами. Я пытался это сделать, но после целых 3-4 прогонов инфинитива l oop предложение меняется и становится «Wonderful What a world» et c. Любая помощь? Спасибо за уделенное время!

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

sem_t mutex;


void *thread_function(void *arg) 
{
char *k=arg;
sem_wait(&mutex);
while(1){
    printf("%s ", k);
        fflush(stdout);  
    sleep(1);
sem_post(&mutex);
}

pthread_exit(NULL);
}

int main() 
{
sem_init(&mutex, 0, 1);
char k[3][11]={"What A", "Wonderful" ,"World"};
  pthread_t mythread1,mythread2,mythread3;
  pthread_create( &mythread1, NULL, thread_function, k[2]); 
  pthread_create( &mythread2, NULL, thread_function, k[1]); 
  pthread_create( &mythread3, NULL, thread_function, k[0]); 
  pthread_join ( mythread3, NULL);
  pthread_join ( mythread2, NULL);
  pthread_join ( mythread1, NULL);
  pthread_exit(NULL);
sem_destroy(&mutex);

return 0;
}

1 Ответ

1 голос
/ 27 мая 2020

Есть пара проблем. Вы не можете добиться этого с помощью одного семафора, поскольку вы не можете обеспечить соблюдение порядка. Вам нужно 3 семафора (в идеале в массиве) и передать индекс для каждого потока (сделайте это тем же индексом, что и слово, которое нужно напечатать). Сделайте массив семафоров и массив слов глобальными, чтобы не усложнять задачу.

Убедитесь, что первый семафор инициализирован значением 1, а остальные инициализированы значением 0.

В потоке подождите, пока семафор (на основе переданного индекса), распечатайте слово и затем отправьте на следующий семафор (mutex[(index+1) % 3])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...