0

我正在尝试实现一个 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.

任何人都可以帮助纠正这些问题吗?

4

1 回答 1

0

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失败。

于 2012-10-22T16:40:07.243 回答