是否有任何库/ 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。