在线程库中使用getcontext()进行分段错误

时间:2014-04-15 01:12:06

标签: c multithreading

我正在尝试使用系统调用(例如get context,swap context等)在C中实现用户级线程库

我有一个如下所示的线程控制块:

struct tcb {
    int thread_id;
    int thread_pri;
    ucontext_t *thread_context;
    struct tcb *next;
}

我有一个名为init()的函数,如下所示:

void t_init()
{
  tcb *tmp;
  tmp = malloc(sizeof(tcb));

  getcontext(tmp->thread_context);    /* let tmp be the context of main() */
 running_head = tmp;
}

我使用了gdb,我在运行时在getcontext(tmp-> thread_context)函数中遇到了分段错误。

我已经阅读了getcontext()的手册页,但我不确定为什么这会向我返回一个分段错误!

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您尚未为thread_context分配任何空间,请尝试

void t_init()
{
    struct tcb *tmp;
    tmp = malloc(sizeof(struct tcb));
    if (!tmp)
        return -1;

    memset(&tmp, 0, sizeof(struct tcb));
    tmp->thread_context = malloc(sizeof(ucontext_t));
    if (!tmp->thread_context)
        return -1;

    getcontext(tmp->thread_context);
}

答案 1 :(得分:0)

我们可以获得以下有关getcontext/setcontext “GNU C库参考手册章节:23非本地人退出,页面622”“ 的信息,并找到以下

  

在为堆栈分配内存时,必须要小心。   大多数现代处理器会跟踪某个内存区域是否允许包含已执行或未执行的代码。数据段和   堆内存通常没有标记为允许这样做。结果是   程序会失败。此类代码的示例包括调用   GNU C编译器生成的序列,用于调用嵌套函数。   正确分配堆栈的安全方法包括使用内存   原始线程堆栈或显式分配标记的内存   使用内存映射I / O执行。

这导致了问题,您应该使用建议的步骤来分配内存(使用内存映射I / O有关更多信息,请参阅libc手册)。