【问题标题】:Running Function Inside Stub. Passing Function Pointer在存根内运行函数。传递函数指针
【发布时间】:2013-10-20 15:23:04
【问题描述】:

我正在创建一个用户级线程库,我想做的是在存根中运行一个函数,所以我想将函数指针传递给存根函数。

这是我的存根函数:

void _ut_function_stub(void (*f)(void), int id)
{
    (*f)();
    DeleteThread(id);
}

这就是用户所说的。我想要做的是获取 _ut_function_stub 的指针以分配给 pc 并且我尝试了各种不同的选项,包括强制转换,但编译器一直说“无效使用 void 表达式” .

int CreateThread (void (*f) (void), int weight)
{
    ... more code

    pc = (address_t)(_ut_function_stub(f, tcb->id));

    ... more code
}

感谢任何帮助。谢谢!

【问题讨论】:

  • 不管怎样,问题是你想要_ut_function_stub的地址,但是你试图转换函数调用的结果...
  • C.我添加了 C++ 标记,认为它是相同的概念。
  • 我尝试使用 & 来获取地址。编译器说“lvalue required as unary & operand
  • 这在 C++ 中实际上可能要容易得多,因为您可以使用 functor 来保存函数及其参数,这看起来就像您正在尝试做的那样。
  • @ThePedestrian:但是没有地址。您正在尝试对上述代码中的函数 call 进行操作。如果问题是您想以某种方式保存函数指针 的组合来调用它,那么这在 C 中不原生支持。您需要构造一个 functor

标签: c++ c function pointers function-parameter


【解决方案1】:

如果您有兴趣实现自己的用户级线程库,我建议您研究(现已弃用)ucontext 实现。具体来说,查看ucontext.h 中使用的结构的定义将帮助您了解实际需要捕获的所有内容,以获得线程状态的有效快照。

在您的示例中,您真正尝试使用错误的(address_t) 演员捕捉的是当前的continuation。不幸的是,C 不支持一流的延续,所以你会被困在做一些更底层的事情,比如交换堆栈和转储寄存器(因此为什么我指向你 ucontext 作为参考——它正在发生如果你真的想做到这一点,那就有点复杂了)。

【讨论】:

  • 我还应该指出,任何解决方案除了复杂之外,也将是不可移植的。您必须做一些与 make ucontext work on windows 与类 unix 系统截然不同的事情。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多