【问题标题】:makecontext uc_link gives segmentation faultmakecontext uc_link 给出分段错误
【发布时间】:2013-01-10 18:12:11
【问题描述】:

我正在尝试制作像 pthreads 这样的用户级线程库。我正在使用 makecontext()/swapcontext() 在线程之间进行切换,并且在为线程创建上下文时,我正在传递 uctx_main em> 到上下文中的 uc_link 字段。

context.uc_stack.ss_sp = thread->c_stack;
context.uc_stack.ss_size = sizeof(thread->c_stack);
context.uc_link = &uctx_main;

但是,当我的线程终止时,它会给我一个分段错误。我的主程序仍在运行。

另外,谁能解释一下 uctx_main 是什么?它是主要功能的默认上下文吗?我需要为我创建的每个线程都有一个 uctx_main 吗?很抱歉问了这么愚蠢的问题,但我在谷歌上没有找到任何东西。

【问题讨论】:

  • 我不确定在这种情况下,但如果你要交换上下文,你交换的所有东西都必须有一个。这意味着,如果“主函数”在初始化你的库后再次运行,它应该在你的线程库中作为一个线程运行,因此必须有一个上下文来交换。T

标签: c multithreading pthreads coroutine context-switch


【解决方案1】:

根据您对uctx_main 的引用,我假设您正在遵循Linux man page for makecontext() 中的示例。

在该示例中,uctx_main 是主线程的上下文,在调用setcontext() 以切换到uctx_func2 时设置。

uctx_main 在任何方面都没有什么特别之处,除了它是从主线程设置的(并且在示例中被设置为uctx_func1 的后继)。

通常,您创建的每个线程都需要有一个上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多