c - P线程介绍

标签 c linux multithreading pthreads

我是 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 - P线程介绍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31489921/

相关文章:

linux - cp 的所有可能的退出代码

c - 相同的字符串产生不同的哈希索引

c - union 数据结构对齐

c - 在嵌入式C中,如何将 "Unsigned Char"形式的返回十六进制值转换为可用的 "Integer"类型

C-->如何使用信号量协调进程行为?

c# - Windows服务计时器多线程

mysql - 从 cron 作业执行 bash 脚本时出现 "/bin/bash^M: bad interpreter: No such file or directory"错误

c - TCP/IP头文件的组织

java - 多个线程如何调用单例对象的方法并对其进行处理?

c# - 多种方法的线程同步