1

我正在做一项学校作业,我需要在其中建立一个线程库。我需要pc保存给定 Thread 对象run()函数的地址。当我尝试将成员函数指针强制转换为address_t(实际上是无符号长整数)时,我收到此错误

../main.cpp: 在函数'void setup(Thread&)'中:

../main.cpp:77:22:错误:从类型“int (Thread::*)()”到类型“address_t {aka unsigned int}”的无效转换</p>

制作:* [main.o] 错误 1

这是我得到错误的函数:

void setup(Thread &thread)
{
    address_t sp, pc;

    sp = (address_t)stack1 + STACK_SIZE - sizeof(address_t);
    int (Thread::*temp)() = &Thread::run;
    pc = (address_t) temp; // @@ LINE 77 @@

    sigsetjmp(jbuf[0],1);
    (jbuf[0]->__jmpbuf)[JB_SP] = translate_address(sp);
    (jbuf[0]->__jmpbuf)[JB_PC] = translate_address(pc);
    sigemptyset(&jbuf[0]->__saved_mask);
}

几点澄清:

Thread 是我写的一个类,目前什么也没做。它作为int run(void)它的“主要”功能。address_t,正如我所说,是typedef unsigned long int

关于我为什么会收到此错误的任何想法?谢谢

4

2 回答 2

4

我不认为你能做到这一点。

void指针是指向数据的指针,函数指针指向函数。该语言不要求函数和数据位于相同的地址空间中,因此,作为示例而非限制,在将它们放在不同地址空间中的体系结构上,两种不同的指针类型将不具有可比性。

看看这个不错的常见问题解答。如果您无法转换为void*,则您无法转换为intlong int

于 2012-04-21T12:26:04.437 回答
1

这不起作用有两个原因:

  1. void*函数指针与(se UmNyobe's answer)不兼容,并且
  2. 为了将成员函数用作线程条目,您还需要存储一个this指针。

由于您使用的是 C++,因此您有一些可能性:

  1. 使用thread_base定义虚函数的基类作为线程入口点。
  2. 使用仿函数作为线程入口点。

无论哪种情况,您都需要将此信息存储在某处并使用操作系统的线程库调用它。

于 2012-04-21T12:30:04.477 回答