我正在用 C++
编写一个与线程一起工作的程序。当我尝试创建进程时出现以下错误:Member function must be called or its address taken in function
。这是我的代码:
void PCB::createProcess(){
asm cli
this->stack = new unsigned[stackSize];
stack[stackSize-1] = 0x200;
stack[stackSize-2] = FP_SEG(wrapper);
stack[stackSize-3] = FP_OFF(wrapper);
this->ss = FP_SEG(stack+stackSize-12);
this->sp = FP_OFF(stack+stackSize-12);
asm sti
}
void PCB::wrapper(){
myThread->run();
myThread->state = TERMINATED;
}
我在这两行中得到了错误:
stack[stackSize-2] = FP_SEG(wrapper);
stack[stackSize-3] = FP_OFF(wrapper);
我什么都试过了。
我试过 (&(wrapper))
, PCB::wrapper
, &PCB::wrapper
没有任何帮助,它只会给我更多的错误. PCB
是类的名称。
如果有人有想法,请帮忙。
最佳答案
FP_SEG
和 FP_OFF
是分别从指针中提取段选择器和偏移量的宏。二十多年前,我们就是这样在 DOS 和早期版本的 Windows 下操作指针的。除非您的目标是一些您没有提到的时髦系统,否则它们是完全不合适的。
因为 PCB::wrapper
是一个成员函数,指向它的指针是指向成员函数的指针。它不是一个普通函数,因此编译器提示它无法理解代码试图做的事情是正确的。
如今,多线程是通过 std::thread
完成的。您不必进行那种骇人听闻的堆栈操作;只需将指向成员函数的指针和 this
指针传递给 std::thread
的构造函数。
std::thread thr(&PCB::wrapper, this);
关于c++ - "Member function must be called or its address taken in function"C++错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48212419/