我正在尝试实现fork函数。此功能将一个线程分成两个线程。第一个继续执行,而第二个继续使用f
(参数)开始执行v
(被调用函数)。我的fork函数的代码是
void t_fork(ThreadFunc f, any_ptr v, char *name)
{
tcb *currentTcb = malloc(sizeof(tcb));
currentTcb->func= f;
currentTcb->arg= v;
currentTcb->sig=NULL;
strcpy(currentTcb->name,name);
setjmp(currentTcb->context);
q_insert(theadSystem.waitQ,currentTcb);
(*f)(v);
}
我还需要使用spawn例程为新线程分配堆栈空间。
在我的代码
setjmp
中导致错误的地方,我也不知道如何使用spawner为新线程分配空间。它导致异常:
Unhandled exception at 0xcccccccc in Threads.exe: 0xC0000005: Access violation.
谁能帮助纠正这些问题?
最佳答案
Unhandled exception at 0xcccccccc in Threads.exe: 0xC0000005: Access violation.
表示您正在Windows上运行,可以确认您的环境吗?请注意,将其命名为fork
会使UNIX用户感到困惑!
您的内存访问冲突意味着您在某处有一个duff指针,但是在您提供的信息有限的情况下,这是无法分辨的。尽管我们不知道*f
是什么,但是您的代码中似乎都没有创建线程。您在哪里调用CreateThread
或_beginthreadex
(假设您使用的是Windows本机线程)。
您提到线程setjmp / longjmp,然后询问有关spawn
的信息,该信息在Windows上创建了一个新进程。您使用的是多个线程还是多个进程?
我刚刚发现了您的问题:我如何使用setjmp和longjmp从一个进程执行上下文切换到另一进程,答案是您不能。 setjmp / longjmp是一种在进程内(而不是在进程之间)跳来跳去的方法,而且是造成内存泄漏的一种好方法。我会像瘟疫一样避免setjmp / longjmp。
编辑:这是我最好的猜测。我敢打赌,您的tcb块的名称为:
char * name
而您只是对其执行
strcpy
而不分配任何内存和初始化指针。 strcpy(currentTcb->name,name);
可能会覆盖堆栈指针,以致setjmp
失败。关于c - 在C中实现fork(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13015281/