【发布时间】:2011-09-08 00:03:07
【问题描述】:
是否有任何库/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.
【问题讨论】:
-
AFAIK 事件 fork() 不允许分叉进程在分叉函数的上下文中执行,因为
-
我认为这对于任何非平凡的使用都会有问题——使用同一个堆栈的两个线程会很快相互连接。想象一下原来的线程调用一个函数,而新线程调用一个不同的函数,并且两个线程几乎同时试图将它们的函数的局部变量推送到同一个堆栈上……某人的局部变量会被破坏并崩溃。跨度>
-
tfork可以将堆栈作为父堆栈的副本,不是吗? -
@Jeremy Friesner:同一个堆栈上的两个线程显然是灾难性的,但分配第二个堆栈并复制状态会起作用。
-
它必须重新定位堆栈上指向堆栈上其他位置的任何指针。
标签: c linux multithreading unix posix