Мне дали иерархию процессов с 5 потоками для процессов 3 и 5. Я должен синхронизировать эти потоки, используя System V, семафоры POSIX или блокировки POSIX. Я думаю, что в основном это мое плохое понимание того, как работает значение семафора, и не знаю, как работают общие семафоры. Я должен убедиться, что поток 3.4 заканчивается до запуска потока 5.1, а 3.5 запускается после окончания 5.1.
У каждого потока и процесса есть эта ИНФО (BEGIN / END, processNO, threadNO), которую необходимо добавить при запуске потока или концы. например:
INFO(BEGIN,3,4); //This means process 3, thread 4 stars
printf("%d",4);
INFO(END,3,4);
void* threadFunctionQ5(void* params){
structura5* param=(structura5*)params;
sem_wait(param->semaphmain);
if(param->value==5){
sem_wait(param->semaph1);
}
info(BEGIN,3,param->value);
info(END,3,param->value);
if(param->value==4){
sem_post(param->semaph5);
}
sem_post(param->semaphmain);
return NULL;
}
void* threadFunctionQ3(void* params){
structura3* param=(structura3*)params;
sem_wait(param->semaphmain);
if(param->value==1){
sem_wait(param->semaph5q5);
}
info(BEGIN,5,param->value);
info(END,5,param->value);
if(param->value==1){
sem_post(param->semaph1q5);
}
sem_post(param->semaphmain);
return NULL;
}
void question5(){
pthread_t threads[5];
structura5 params[5];
sem_t semaphmain;
sem_t* semaph1q5=sem_open("Semafor1",O_CREAT,0644,0);
sem_t* semaph5q5=sem_open("Semafor5",O_CREAT,0644,0);
if(sem_init(&semaphmain,0,1)!=0){
printf("Error in initializing in q5");
return;
}
for(int i=0;i<5;i++){
params[i].semaphmain=&semaphmain;
params[i].semaph1=semaph1q5;
params[i].semaph5=semaph5q5;
params[i].value=i+1;
pthread_create(&threads[i],NULL,threadFunctionQ5,¶ms[i]);
}
for(int i=0;i<5;i++){
pthread_join(threads[i],NULL);
}
sem_unlink("Semafor1");
sem_unlink("Semafor5");
}
void question3(){
pthread_t threads[5];
structura3 params[5];
sem_t semafor2,semafor4,semaforCerinta;
sem_t* semaph1q5=sem_open("Semafor1",O_CREAT,0644,0);
sem_t* semaph5q5=sem_open("Semafor5",O_CREAT,0644,0);
if(sem_init(&semafor2,0,0)!=0 || sem_init(&semafor4,0,0)!=0 || sem_init(&semaforCerinta,0,3)){
printf("Error in initializing semaphores in q3");
return;
}
for(int i=0;i<5;i++){
params[i].semaphmain=&semaforCerinta;
params[i].semaph1q5=semaph1q5;
params[i].semaph5q5=semaph5q5;
params[i].semafor2=&semafor2;
params[i].semafor4=&semafor4;
params[i].value=i+1;
pthread_create(&threads[i],NULL,threadFunctionQ3,¶ms[i]);
}
for(int i=0;i<5;i++){
pthread_join(threads[i],NULL);
}
sem_unlink("Semafor1");
sem_unlink("Semafor5");
sem_destroy(&semafor2);
sem_destroy(&semafor4);
}
Эти 2, называемые questionX (), являются функциями, вызываемыми внутри объявления процесса x; Проблема в том, что я не получаю требуемое поведение, мои ожидания и сообщения ничего не делают, но их вызывают, так как, если я удаляю sem_wait или sem_post, я получаю бесконечное состояние ожидания. Я не могу дать точное вывод, так как у меня есть тестер с 5 тестами, которые должны работать, но эти 3 потока должны следовать вышеупомянутой идее. Semafor4 и semafor2 были из предыдущей задачи, в которой мне приходилось работать в одном и том же процессе, поэтому я думаю, что они никак не влияют на него.
Strucs
typedef struct{
int value;
sem_t* semaphmain;
sem_t* semaph5;
sem_t* semaph1;
}structura5;
typedef struct{
int value;
sem_t* semafor2;
sem_t* semafor4;
sem_t* semaphmain;
sem_t* semaph1q5;
sem_t* semaph5q5;
}structura3;