我正在尝试实现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/

10-12 00:20