微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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=%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] 举报,一经查实,本站将立刻删除。

相关推荐