为什么makecontext不能与pthreads一起使用

时间:2011-11-17 14:40:52

标签: c linux x86 pthreads

来自makecontext manual ...

由于当前pthread实现的限制,makecontext不应该在链接pthread(3)库的程序中使用(无论是否使用线程)。

现在我的问题是,为什么它不起作用以及有哪些替代方法。实际上我有兴趣在某些点上在用户级线程中切换堆栈,但我看到当我执行swapcontext时,我偶尔会出现分段错误。我该怎么办?

我想实现这样的目标...

void thread_func(void * thread_args)
{
 a();
 b();
 getcontext/makecontext/swapcontext to call c();
 d();
 ....
}

所以在这种情况下,我想在执行函数 c 时使用单独的堆栈。

1 个答案:

答案 0 :(得分:9)

  

由于当前pthread实现的限制,makecontext不应该在链接到pthread(3)库的程序中使用

本手册的这一部分适用于LinuxThreads,它用于将%esp值向上舍入以查找当前线程描述符。如果你在备用堆栈上执行,那么(显然)不会产生有效的线程描述符。

在过去5年多的时间里,任何发布的Linux都不再使用LinuxThreads,{get,make,swap}context可以正常使用NPTL线程。

编辑:实际上,我只看到NetBSD docs中的“由于限制”,而不是Linux docs

  

当我执行swapcontext时,我偶尔会出现分段错误

您有一个错误,偶尔会显示为分段错误。你没有提供足够的信息来猜测那个bug可能在哪里。