是否有任何库/ 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=%dn",ival); if(ival != 0) { printf("ival changed. done.n"); return 0; } sleep(1); } } }
应该输出:
如何卸载旧版本的Ruby,这是一个明智的做法?
在linux中限制程序的内存使用
AndroID的Systrace工具内部使用strace或ftrace?
是否可以在linux上设置一个gcc交叉编译器来在32位体系结构上编译64位目标?
Mongo服务启动或重新启动总是失败
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.
如何configuration“与心脏起搏器清除过期的失败计数”时间
math背景下的bash *** 作顺序:分配了错误的值
如何在linux驱动程序中挂起回叫?
在linuxterminal中的目录之间快速和智能导航
如何在linux中同时运行find和cp命令?
你不能这样做,因为线程共享相同的地址空间。 继续从相同的执行上下文(如叉())将意味着他们的堆栈在相同的内存。
当然两个线程需要有自己的堆栈,否则会发生麻烦。
这就是为什么你需要指定一个函数来启动一个新的线程 – 因为新的线程有一个新的堆栈。
你可以用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 ); if(-1 == pID) { return -1; } if(pID) { return pID; } else { // Your new thread code goes here }
更多细节在这里: http : //linux.dIE.net/man/2/clone
总结以上是内存溢出为你收集整理的在C中的“线程fork”(理想的POSIX,但只是Linux的作品)全部内容,希望文章能够帮你解决在C中的“线程fork”(理想的POSIX,但只是Linux的作品)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)