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()
首先,我混淆了用于克隆的标志,然后观看了上面代码的strace输出,并用替换了我的主要功能
但是这里主线程在新线程之前终止。
如何实现pthread_join功能?
如果您不需要创建新的线程组(例如,不使用
希望这可以帮助!
(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