我是一个学习Linux的小白,按照教程敲的代码,但是执行之后的结果却很诡异,不知道怎么回事,希望大佬们可以帮忙看一下
我先贴出自己的程序:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <limits.h>
#include <syspes.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sysan.h>
 
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
 
void prepare()
{
        pthread_mutex_lock(&mutex);
        printf("I am prepare\n");
}
void parent()
{
        pthread_mutex_unlock(&mutex);
        printf("I am parent\n");
}
void child()
{
        pthread_mutex_unlock(&mutex);
        printf("I am child\n");
}
void *thread_fun(void *arg)
{
        sleep(1);
        pid_t pid;
        pthread_atfork(prepare,parent,child);
        pid=fork();
        if(pid == 0)
        {
                pthread_mutex_lock(&mutex);
                printf("child process\n");
                pthread_mutex_unlock(&mutex);
        }
        if(pid > 0)
        {
                pthread_mutex_lock(&mutex);
                printf("parent process\n");
                pthread_mutex_unlock(&mutex);
        }
}
 
int main()
{
        pthread_t tid;
        if(pthread_create(&tid,NULL,thread_fun,NULL))
        {
                printf("create new thread failure\n");
                return ;
        }
 
        pthread_mutex_lock(&mutex);
        sleep(1);
        printf("main process\n");
        pthread_mutex_unlock(&mutex);
        pthread_join(tid,NULL);
 
        pthread_mutex_destroy(&mutex);
        return 0;
}
然后我的执行结果却是这样的

解决方案 »

  1.   

    你的意思是不是I am child 和 child process的输出位置很奇怪
      

  2.   

    我也遇到过这样的情况,还没有解决。就是他的输出位置不对应该是:
    main process
    I am prepare
    I am parent
    parent process
    I am child
    child process
    root@xiaoyi..........
    但是结果却是上面的那种情况,不知道为什么?
      

  3.   

    事实wait
    void *thread_fun(void *arg)
    {
            int status = 0;
            sleep(1);
            pid_t pid;
            pthread_atfork(prepare,parent,child);
            pid=fork();
            if(pid == 0)
            {
                    pthread_mutex_lock(&mutex);
                    printf("child process\n");
                    pthread_mutex_unlock(&mutex);
            }
            if(pid > 0)
            {
                    pthread_mutex_lock(&mutex);
                    printf("parent process\n");
                    pthread_mutex_unlock(&mutex);
                    wait(&status);
            }
    }
      

  4.   

    试试wait
    void *thread_fun(void *arg)
    {
            int status = 0;
            sleep(1);
            pid_t pid;
            pthread_atfork(prepare,parent,child);
            pid=fork();
            if(pid == 0)
            {
                    pthread_mutex_lock(&mutex);
                    printf("child process\n");
                    pthread_mutex_unlock(&mutex);
            }
            if(pid > 0)
            {
                    pthread_mutex_lock(&mutex);
                    printf("parent process\n");
                    pthread_mutex_unlock(&mutex);
                    wait(&status);
            }
    }