【问题标题】:Why makecontext does not work with pthreads为什么 makecontext 不适用于 pthread
【发布时间】:2011-12-31 10:08:14
【问题描述】:

来自 makecontext() 手册...

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

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

我想实现这样的目标:

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

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

【问题讨论】:

  • 非常困难的问题;-p!还没有回答!
  • 你想用makecontext/etc 做什么?它们的主要目的是实现线程库,当 pthread 已经存在时,这有点傻。
  • @duskwuff,我没有将它用于线程。

标签: c linux x86 pthreads coroutine


【解决方案1】:

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

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

在过去 5 年多的时间里,任何 Linux 发行版都不再使用 LinuxThreads,{get,make,swap}context 与 NPTL 线程配合得很好。

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

当我执行 swapcontext 时,我时不时会遇到分段错误

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

【讨论】:

  • 很高兴知道它现在可以工作了。感谢您的回答 EmployedRussian :-p!是的,这确实是我现在修复的一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2014-11-10
相关资源
最近更新 更多