процесс застрял в ожидании - PullRequest
0 голосов
/ 01 мая 2019

У меня проблемы с синхронизацией потоков в Linux.Я должен сгенерировать иерархию процессов из этой картинки (эту часть мне удалось сделать) enter image description here.

Но затем мне нужно синхронизировать потоки из разных процессов.Процесс P2 должен создать 6 потоков, а процесс P6 должен создать 5 потоков.И затем поток 5 из P2 должен начинаться только после завершения потока 3 из P6.Я использую условные переменные, но пока я жду окончания потока 3 от P6, процесс 2 остается заблокированным, и я никогда не достигаю процесса 6 для создания его потоков.Информация о функции используется для отображения начала и конца потока.Я не могу спать или уснуть

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>


pthread_cond_t p2_t4=PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock1=PTHREAD_MUTEX_INITIALIZER;
int end=-1;

void* function(void* arg)
{
    int* nrth=(int*) arg;
    info(BEGIN,6,*nrth);
    info(END,6,*nrth);

    pthread_mutex_lock(&lock1);
    if(*nrth==3)
    {
        end=1;
        pthread_cond_signal(&p2_t4);
    }
    pthread_mutex_unlock(&lock1);

    return 0;
}


void* function2(void* arg)
{
int* nrth=(int*) arg;

pthread_mutex_lock(&lock1);
if(*nrth==4)
{
    while(end==-1)
        pthread_cond_wait(&p2_t4,&lock1);
}
pthread_mutex_unlock(&lock1);

info(BEGIN,2,*nrth);
info(END,2,*nrth);
return 0;
}


int main()
{

pthread_t threads[6];
int index[5];

pthread_t threads2[7];
int index2[7];


if(fork()!=0)
{
    //info(BEGIN,1,0);
    wait(NULL);

    if(fork()!=0)
    {
        wait(NULL);
    }
    else
    {
        //info(BEGIN,3,0);

        if(fork()!=0)
        {
            wait(NULL);
            if(fork()!=0)
            {
                wait(NULL);
            }
            else
            {
                //info(BEGIN,6,0);


                for(int i=1; i<=5; i++)
                {
                    index[i]=i;
                    pthread_create(&threads[i],NULL,function,&index[i]);
                }

                for(int i=1; i<=5; i++)
                {
                    pthread_join(threads[i],NULL);
                }

                //info(END,6,0);
                //info(END,3,0);
                //info(END,1,0);
            }
        }
        else
        {
            //info(BEGIN,5,0);
            //info(END,5,0);
        }
    }
}
else
{
    //info(BEGIN,7,0);
    wait(NULL);

    for(int i=1; i<=6; i++)
    {
        index2[i]=i;
        pthread_create(&threads2[i],NULL,function2,&index2[i]);
    }

    for(int i=1; i<=6; i++)
    {
        pthread_join(threads2[i],NULL);
    }


    if(fork()!=0)
    {
        wait(NULL);
        if(fork()!=0)
        {
            wait(NULL);
        }
        else
        {
            //info(BEGIN,7,0);
            //info(END,7,0);
            //info(END,2,0);
        }
    }
    else
    {
        //info(BEGIN,4,0);
        //info(END,4,0);
    }

}
return 0;
}

1 Ответ

1 голос
/ 01 мая 2019

Чтобы сгенерировать это дерево процессов, главный процесс должен сделать 2 вызова fork, чтобы создать 2 дочерних процесса. Этот код блокирует основной процесс после первого fork. Процесс создания кода должен быть переделан.

Мьютексы и условные переменные не являются общими для процессов, поскольку каждый процесс имеет свое собственное частное адресное пространство. Мьютексы и условные переменные должны быть размещены в общей памяти, чтобы их можно было использовать в разных процессах. В качестве альтернативы используйте семафоры POSIX .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...