在C中的“线程fork”(理想的POSIX,但只是Linux的作品)

是否有任何库/ pthread包装/ clone参数,这将允许我有一个tfork就像fork() ,允许您在上下文中继续执行代码,而不是指向一个新的函数来执行新线程。

如果没有,有没有简单的方法来写这个自己?


用法理想上就像fork一样,但意思是线程化的,所以作为一个人为的例子:

 int main() { int ival = 0; if(tfork() == 0) { sleep(10); ival = 5; _exit(); // or exit or return or whatever } else { while(1) { printf("ival=%d\n", ival); if(ival != 0) { printf("ival changed. done.\n"); return 0; } sleep(1); } } } 

应该输出:

 ival=0 ival=0 ival=0 ival=0 ival=0 ival=0 ival=0 ival=0 ival=0 ival=0 ival=5 ival changed. done. 

你不能这样做,因为线程共享相同的地址空间。 继续从相同的执行上下文(如叉())将意味着他们的堆栈在相同的内存。

当然两个线程需要有自己的堆栈,否则会发生麻烦。

这就是为什么你需要指定一个函数来启动一个新的线程 – 因为新的线程有一个新的堆栈。

你可以用openMP来做这样的事情

不完全是这样的,但是它自动创建线程,并且有同步和通信的机制。

呃,这几乎是vfork()在Linux上所做的,它共享父级的内存(但不共享线程应该共享的其余部分)。

由于共享内存的父母导致问题已经在你的问题(snd一些其他问题)的评论中讨论过的问题,一个vfork()父实际上被挂起,直到孩子放弃所有引用的内存,通常通过execve()_exit() (注意下划线, exit()vfork()子程序中不安全)。

vfork()孩子唯一能够安全地做的事情是调用exec*()_exit() 。 有了大量的知识和黑魔法的巫术,有些人可以在Linux上的vfork()孩子上做更多的事情,但是这需要很多细节的关注。

所以,正如你所看到的,在共享内存和返回一个la fork()时你可以做的事情有很多限制: 为什么创建线程通常是通过调用一个函数来完成的

在Linux中,fork()和pthread_create()只是clone()的一个包装。 你可以直接调用clone()来获得所需的效果。 例如(不是实际的代码,但非常接近):

 pid = syscall(SYS_clone, (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SYSVSEM | CLONE_PARENT), NULL, NULL, NULL ); if(-1 == pid) { return -1; } if(pid) { return pid; } else { // Your new thread code goes here } 

更多细节在这里: http : //linux.die.net/man/2/clone