ПРИМЕЧАНИЕ: Чтобы понять мой вопрос, вам может нужно узнать о моем проекте и проблеме. Если нет, перейдите вправо к разделу «ВОПРОС» внизу.
<ч /> ПРОЕКТ
Я работаю над написанием класса C ++, который позволяет его родителю вести себя как синхронные / блокирующие потоки, используя Pause () и Resume ().
Вот пример того, как это будет работать.
class BlockingThread
: public BlockingThreadBase // all the Asm magic happens in BlockingThreadBase
{
void StartStopHere(void) // called upon the first Resume() call (pure virtual in base)
{
printf("1"); Pause();
printf("3"); Pause();
printf("5"); Pause();
}
};
int main(void)
{
BlockingThread obj;
obj.Resume(); printf("2");
obj.Resume(); printf("4");
obj.Resume(); printf("6");
return 0;
}
// OUTPUT: 123456
Я пробовал настоящую многопоточность и несколько новых идей, но они оказались слишком медленными для передачи между местами кода 21 миллион раз в секунду.
Моя последняя идея - использовать куски стека (буферы стека) для создания иллюзии нескольких стеков. Когда вызывается obj1.Resume (), он возвращается в местоположение своего личного стека, New #1 Stack
, выполняется до Pause (), а затем возвращается в предыдущее положение стека, в котором он находился.
<ч /> ИЛЛЮСТРАЦИИ
Как будет выглядеть стек без BlockingThread
объектов в main ().
_________________
| Normal | Stack |
| Stack | Buffer |
|________|________|
Как будет выглядеть BlockingThread
объект в main () в стеке.
___________________________________
| Normal | Stack | New #1 | Stack |
| Stack | Buffer | Stack | Buffer |
|________|________|________|________|
Как два BlockingThread
объекта в main () будут выглядеть в стеке.
_____________________________________________________
| Normal | Stack | New #1 | Stack | New #2 | Stack |
| Stack | Buffer | Stack | Buffer | Stack | Buffer |
|________|________|________|________|________|________|
<ч /> ПРОБЛЕМА
При перемещении в «новый» стек и последующем вызове obj.Resume () (из main), который, в свою очередь, вызывает StartStopHere (), вызывает segfault в точке вызова StartStopHere (). GDB говорит can't find linker symbol for virtual table for 'BlockingThreadBase' value
, когда я пытаюсь получить значение переменной-члена из BlockingThreadBase. Вот почему я подозреваю, что у него такая же проблема при попытке найти местоположение StartStopHere (), когда он вызывается.
<ч /> ВОПРОС
(игнорируйте слова, выделенные курсивом, если вы не читали другие разделы)
Как найти [ и переместить или скопировать ] виртуальную таблицу (или ее местоположение, если она хранится) класса в стеке [ normal ] [ в новый стек ]?