1

我正在编写一个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是类的名称。

如果有人有想法,请帮助。

4

1 回答 1

0

FP_SEGFP_OFF是分别从指针中提取段选择器和偏移量的宏。二十多年前,这就是我们在 DOS 和早期版本的 Windows 下操作指针的方式。除非你的目标是一些你没有提到的时髦系统,否则它们是完全不合适的。

由于PCB::wrapper是成员函数,指向它的指针就是指向成员函数的指针。它不是一个普通的函数,所以编译器抱怨它无法理解代码试图做什么是正确的。

这些天来,多线程是用std::thread. 您不必进行那种 hacky 堆栈操作;只需将指向成员函数的this指针和指向构造函数的指针传递给std::thread.

std::thread thr(&PCB::wrapper, this);
于 2018-01-11T17:47:09.583 回答