[Решено] Синхронизировать потоки из разных процессов, чтобы они вступили в силу в указанном c порядке Linux - PullRequest
0 голосов
/ 25 апреля 2020

Мне дали иерархию процессов с 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,&params[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,&params[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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...