来自makecontext manual ...
由于当前pthread实现的限制,makecontext不应该在链接pthread(3)库的程序中使用(无论是否使用线程)。
现在我的问题是,为什么它不起作用以及有哪些替代方法。实际上我有兴趣在某些点上在用户级线程中切换堆栈,但我看到当我执行swapcontext时,我偶尔会出现分段错误。我该怎么办?
我想实现这样的目标...
void thread_func(void * thread_args)
{
a();
b();
getcontext/makecontext/swapcontext to call c();
d();
....
}
所以在这种情况下,我想在执行函数 c 时使用单独的堆栈。
答案 0 :(得分:9)
由于当前pthread实现的限制,makecontext不应该在链接到pthread(3)库的程序中使用
本手册的这一部分适用于LinuxThreads,它用于将%esp
值向上舍入以查找当前线程描述符。如果你在备用堆栈上执行,那么(显然)不会产生有效的线程描述符。
在过去5年多的时间里,任何发布的Linux都不再使用LinuxThreads,{get,make,swap}context
可以正常使用NPTL线程。
编辑:实际上,我只看到NetBSD docs中的“由于限制”,而不是Linux docs。
当我执行swapcontext时,我偶尔会出现分段错误
您有一个错误,偶尔会显示为分段错误。你没有提供足够的信息来猜测那个bug可能在哪里。