многопоточность — «Функция-член должна быть вызвана или ее адрес должен быть взят в функции» Ошибка C ++

Я пишу программу в 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 это имя класса.

Если у кого есть идея, пожалуйста, помогите.

1

Решение

FP_SEG а также FP_OFF являются макросами, которые извлекают селектор сегмента и смещение, соответственно, из указателя. Вот как мы манипулировали указателями в DOS и ранних версиях Windows двадцать с лишним лет назад. Если вы не нацелены на какую-то забавную систему, которую вы не упомянули, они совершенно неуместны.

поскольку PCB::wrapper является функцией-членом, указатель на нее является указателем на функцию-член. это не обычная функция, поэтому компилятор вправе жаловаться на то, что он не имеет смысла из того, что пытается сделать код.

В эти дни многопоточность выполняется с std::thread, Вам не нужно делать эту хакерскую манипуляцию со стеком; просто передайте указатель на член-функцию и this указатель на конструктор для std::thread,

std::thread thr(&PCB::wrapper, this);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]