This question already has an answer here:
How to wait for threads to finish their work, where threads created by clone in c?

(1个答案)


6年前关闭。




毫无疑问,pthread_create()调用了克隆,但是可以修改具有pthread_join()的程序吗?

实际上,我正在尝试修改此代码以使用clone()
#include <stdio.h>
#include <sched.h>
#include <pthread.h>

void *childfun (void *para)
{
    sleep(2);
    printf("child terminating\n");
}

int main (void)
{
    void * stackptr;
    pthread_t readthread;
    pthread_create(&readthread,NULL,childfun,NULL);
    pthread_join(readthread,NULL);
    printf("exit\n");
}

首先,我混淆了用于克隆的标志,然后观看了上面代码的strace输出,并用替换了我的主要功能
int main (void)
{
    int ctid;
    void *stackptr;
    stackptr = malloc(getpagesize());
    ctid = clone(childfun , stackptr+getpagesize() , CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|   CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,NULL);
    printf("exit\n");
}

但是这里主线程在新线程之前终止。
如何实现pthread_join功能?

最佳答案

正如alk所说,如果您使用CLONE_THREAD,则不能使用wait()等待线程完成。



man page还告诉我们:



因此,如果必须使用CLONE_THREAD,则可以使用pause()或其他某种信号处理机制来等待整个线程组完成。

...
    ctid = clone(childfun , stackptr+getpagesize() , CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|   CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,NULL);
    pause();
    printf("exit\n");
}

如果您不需要创建新的线程组(例如,不使用CLONE_THREAD),则可以像惯常的“正常”流程处理一样使用wait():
...
    ctid = clone(childfun , stackptr+getpagesize() , CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND |CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,NULL);

     ctid = waitpid( ctid, 0, 0 );
     if ( ctid == -1 ){
        perror( "waitpid" );
        exit( 3 );
    }
}

希望这可以帮助!

关于c - 如何用clone()替换pthread_join()和pthread_create(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23511278/

10-09 12:49