我是stackoverflow的长期读者,决定自己寻求帮助。在我问之前,这是一个家庭作业问题,似乎最好通知大家。任务是多线程的,我在linux环境中使用C。我的错误是,一旦运行./crazy.out文件,就会创建教授线程并显示printF,但不会显示其他内容。我不确定我是否正确地使用互斥和条件信号来使学生线程与它一起工作。
教授职能

void Professor()
{
//Initialize global variables
studentCondition = 0;
professorCondition = 0;
snack = 0;
wakeup = 0;
students = 0;

//Initialize pthread mutex
pthread_mutex_init(&lock_prof, NULL);
pthread_mutex_init(&lock_stud, NULL);
pthread_mutex_init(&lock_wait, NULL);
pthread_mutex_init(&lock_snack, NULL);
pthread_mutex_init(&lock_question, NULL);

//Initialize pthread conditions
pthread_cond_init(&professor, NULL);
pthread_cond_init(&student, NULL);

if( pthread_create(&pStack, NULL, professorThread(), NULL))
{
    perror("Thread creation failed!!");

}
}

教授的线索。
void * professorThread()
{

printf("Crazy professor's hours have started!\n");

if(students == 0)
{
    Nap();
}
pthread_cond_wait(&professor, &lock_prof);
professorCondition = 1;
while(professorCondition)
{
    professorCondition = 0;
    if(stud != NULL)
    {
        AnswerStart();
        AnswerDone();
        //Increment snack counter
        snack++;

        //Since answer is finished, tell the student
        pthread_cond_signal(&student);

        //If 3 questions have been answered, snack time!
        if(snack == 3)
        {
            pthread_cond_wait(&professor, &lock_question);//Lock professor     while he snacks. No questions please.
            Snack();
            snack = 0;
        }
    }
}
return EXIT_SUCCESS;
}

学生函数和线程。
void Student(int id, int numQuestions)
{
struct student * newStudent = malloc(sizeof(student));

newStudent->id = id + 1001;
newStudent->numQuestions = numQuestions;

pthread_t tStack;

if(pthread_create(&tStack, NULL, (void *) &studentThread, (void *) newStudent ) )
{
    perror("Creation of thread occurred.");
    exit(0);
}
}

void * studentThread(void * student)
{
struct student * s = student;

printf("Student %d is at professor's door and wants to ask %d questions\n", (*stud).id, (*stud).numQuestions);

//don't forget increment num of students
students++;
if(stud != NULL)
{
    data = (*data).next;
    (*data).next = s;
}else
     {
    data = stud;
    stud = s;
     }
//mutex lock students
pthread_mutex_lock(&lock_stud);
while(1){


    //wait for prof
    pthread_mutex_lock(&lock_prof);
    //ask q
    if(stud != NULL)
    {
        stud = NULL;
        pthread_cond_signal(&professor);
    }

    if( stud != NULL)
    {
        QuestionStart();
        QuestionDone();
    }

    //mutex unlock
    pthread_mutex_unlock(&lock_prof);
}
//run question loop until numstudents = 0
}

最佳答案

根据发布的代码:

1) the professor arrives at his office
2) if no students in a the crowd outside the office, then professor naps
3) professor lets one student, from crowd, into his office
4) the student asks a question
5) the professor answers the question
6) the student leaves the office
7) the professor leaves his office

因此,共享资源是教授/办公室(需要互斥锁)
所以,人群就是那些想接近教授的学生
目前,教授只处理一个学生,然后离开。
可能不是想要的,因为它不处理多个学生,也不处理任何一个学生有多个问题。
国际海事组织:
there needs to be multiple student threads.
Each student thread has a random number of questions. (which could be 0)
student loop:
    if number student questions is > 0
    then student pends on professor resource
    else student exits loop (exits student thread)

    When a student gets the professor resource,
        the student locks the professor resource.(enters office)
        the student asks question
        the professor answers question
        the student unlocks the professor resource (exits office)
        the number of questions for that student is decremented
end loop

为了教授能做其他事情,
教授可以让学生知道他们什么时候有空(也许通过条件信号)
学生可以让教授知道他们想问一个问题(也许通过条件信号)

关于c - Pthread简介,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31489921/

10-09 05:15