Я пишу программу в 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);
Других решений пока нет …