是否有任何库/ 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