В настоящее время я работаю над многопоточной программой для представления TA с русскими учениками. Когда студенты приходят, они должны сидеть в коридоре на стуле (в офисе TA есть 3 стула + 1 стул). Если больше нет стульев, они должны вернуться домой и подождать.Многопоточная программа
Вот мой код:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>
#include <stdbool.h>
#include <semaphore.h>
pthread_mutex_t mutex; /* mutex lock */
sem_t studentSem;
sem_t taSem;
int chairs = 1;
void *student(void *param);
void *ta(void *param);
int main(int argc, char* argv[]){
if(argc!=2){
fprintf(stderr, "Un nombre d'etudiant est requis en paramètre\n");
return -1;
}
if(atoi(argv[1])<0){
fprintf(stderr, "Un nombre d'etudiant >= 0 est requis\n");
return -1;
}else{
int numStudents = atoi(argv[1]);
int numThreads = numStudents + 1; /* n etudiant + 1 TA */
pthread_t tid[numThreads]; /* thread ID */
pthread_attr_t attr; /* thread attributes */
sem_init(&studentSem, 0, 1);
sem_init(&taSem, 0, 0); /* 0 car TA attend etudiant */
pthread_attr_init(&attr);
int i = 0;
pthread_create(&tid[i], &attr, ta, NULL); /*creer le TA*/
for (i = 1; i < numThreads; i++){
pthread_create(&tid[i], &attr, student, (void*)i); /*creer etudiant*/
}
for (i = 0; i < numThreads; i++){
pthread_join(tid[i], NULL);
}
}
return 0;
} /*fin du main*/
void *ta (void *param){ /*le thread pour TA*/
while(ta){
sem_post(&studentSem);
pthread_mutex_lock(&mutex);
chairs--;
pthread_mutex_unlock(&mutex);
printf("helping students\n");
sleep(rand()%(1+3));
sem_wait(&taSem);
}
}
void *student(void *param){
int *t;
t = (int *)param;
while(student){
if(chairs < 4){
pthread_mutex_lock(&mutex); /* protects chairs */
chairs++; /* incrementer chairs car etudiant prend cette chaise */
pthread_mutex_unlock(&mutex); /* releases mutex lock */
printf("%i is sitting down\n", t);
sem_post(&taSem); /* etudiant signal le TA pour demander de l'aide */
sem_wait(&studentSem); /* etudiant attend jusqua temps que TA l'aide et peut ensuite partir */
} else { /* no chairs available, so the student "goes home" */
printf("%i is going home\n", t);
sleep(rand()%(1+5)); /* sleeps a random amount of time */
}
}
}
Моя проблема в том, что я не могу заставить его работать правильно. Когда я запускаю программу с помощью «sleepingTA 5» на UNIX, это дает мне следующий результат:
1 is sitting down
1 is sitting down
1 is sitting down
1 is sitting down
2 is sitting down
3 is going home
4 is going home
5 is going home
5 is going home
1 is going home
1 is sitting down
...
Цикл всегда работает бесконечно. Я не знаю, как это изменить, после того, как ему помогли, студент уходит ... (не как № 1, который возвращается).
Кроме того, мне нужно, чтобы студент сидел только один раз, не много раз подряд (например, 1), и мне нужно, чтобы студент возвращался домой один раз, не раз подряд (например, 5) ...
Что в вашем коде вы думаете, останавливает тот же студент, сидящий снова и снова? –
Ничего еще ... Я попробовал сказать sem_post (& studentSem), чтобы выпустить его, но не сработал! – cditomas
Пожалуйста, что такое «* TA *»? Терминальный адаптер? -) – alk