Я работаю над кодом. Описание выглядит следующим образом: Существует профессор и количество студентов (предположительно 3 в коде). Студенты могут задавать вопросы и профессор ответит держать следующее mind-Threads and Synchronization
(I) только один человек говорит, в то время,
(б) каждый студент вопрос отвечает профессор, и
(iii) ни один студент не задает другого вопроса до того, как профессор выполнит ответ на предыдущий вопрос.
Вероятный выход для кода может быть:
Student 0 enters the office.
Student 1 enters the office.
Student 1 asks a question.
Professor starts to answer question for student 1.
Professor is done with answer for student 1.
Student 1 is satisfied.
Student 0 asks a question.
Professor starts to answer question for student 0.
Professor is done with answer for student 0.
Student 0 is satisfied.
Student 0 leaves the office.
Student 2 enters the office.
Student 2 asks a question.
Professor starts to answer question for student 2.
Professor is done with answer for student 2.
Student 2 is satisfied.
Student 2 leaves the office.
Моего код прилагается ниже, я не получаю желаемый результат. Любая помощь в том, что я делаю неправильно, очень ценится.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/fcntl.h>
sem_t student,professor, askQuestion,numberOfStudents;
int id=0,number=0;
void AnswerStart()
{
printf("Professor starts to answer question for studnet %d\n",id);
return;
}
void AnswerDone()
{
printf("Professor is done with the answer of student %d\n",id);
return;
}
void QuestionStart()
{
printf("Student %d asked a question\n",id);
return;
}
void QuestionDone()
{
printf("Studnet %d is stisfied\n",id);
return;
}
void Studnet(void *a)
{
sem_wait(&numberOfStudents);
number++;
printf("Student %d enters office\n",(int *)a);
sem_post(&numberOfStudents);
sem_wait(&askQuestion);
id = (int *)a;
QuestionStart();
sem_post(&professor);
sem_wait(&student);
QuestionDone();
sem_post(&askQuestion);
sem_wait(&numberOfStudents);
number--;
printf("Student %d leaves office\n",(int *)a);
sem_post(&numberOfStudents);
}
void Professor(void *a)
{
printf("Professor is in office\n");
while(1){
sem_wait(&professor);
AnswerStart();
AnswerDone();
sem_post(&student);
sem_wait(&numberOfStudents);
if(number==0)
return;
sem_post(&numberOfStudents);
}
}
int main(){
sem_init(&student,0,0);
sem_init(&professor,0,0);
sem_init(&askQuestion,0,1);
sem_init(&numberOfStudents,0,1);
pthread_t studentThread[3], professorThread;
pthread_create(&professorThread,NULL,Professor,NULL);
pthread_create(&studentThread[0],NULL,Studnet,(void *)0);
pthread_create(&studentThread[1],NULL,Studnet,(void *)1);
pthread_create(&studentThread[2],NULL,Studnet,(void *)2);
pthread_join(studentThread[0],NULL);
pthread_join(studentThread[1],NULL);
pthread_join(studentThread[2],NULL);
pthread_join(professorThread,NULL);
sem_destroy(&student);
sem_destroy(&professor);
sem_destroy(&askQuestion);
sem_destroy(&numberOfStudents);
return 0;
}
Это похоже на вариант проблемы обеденных философов, вы можете найти и прочитать об этом? –
Было бы неплохо узнать, что не так с вашим выходом. Или ... какой результат? – Bart
Я проверил его на linux (после исправления void * return для функций потока и void * cast to int с 64 бит) и ** он отлично работает **. Единственное, о чем я могу думать, это то, что программа зависает с тех пор, как профессор контуров «while (1)» и ждет в основном. В чем проблема с вашей продукцией? –