等待过程

时间:2019-05-01 15:10:20

标签: c linux multithreading

我在Linux上进行线程同步时遇到麻烦。我必须根据这张图片生成流程层次结构(这是我设法完成的部分)enter image description here

但是接下来,我必须同步来自不同进程的线程。进程P2必须创建6个线程,而进程P6必须创建5个线程。然后,P2中的线程5必须仅在P6中的线程3完成之后开始。我使用条件变量,但是在等待线程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 个答案:

答案 0 :(得分:1)

要生成该进程树,主进程必须对fork进行2次调用以创建2个子进程。此代码在第一个fork之后阻止主进程。创建过程的代码必须重做。

互斥量和条件变量不在进程之间共享,因为每个进程都有自己的专用地址空间。必须将互斥量和条件变量放置在共享内存中,以便在各个进程之间共享。或者,使用POSIX semaphores