EDIT: SOLVED
Я работаю над многопоточным проектом прямо сейчас, где у меня есть базовый рабочий класс с разными классами рабочих, которые наследуют его. Во время выполнения рабочие классы становятся потоками, которые затем выполняют работу по мере необходимости.
Теперь у меня есть директор, который я написал, который должен поддерживать массив указателей для всех рабочих, чтобы он мог извлекать из них информацию, а также изменять в них переменные позже.
Я сделал это, создав указатель на указатель базового класса:
baseWorkerClass** workerPtrArray;
Затем в конструкторе Директора я динамически выделяю массив указателей на базовый рабочий класс:
workerPtrArray = new baseWorkerClass*[numWorkers];
В конструкторе каждого рабочего потока рабочий вызывает функцию в директории, которая предназначена для хранения указателя этого рабочего в массиве.
Здесь, как режиссер хранит указатели:
Director::manageWorker(baseWorkerClass* worker)
{
workerPtrArray[worker->getThreadID()] = worker;
}
Вот пример рабочего варианта. Каждый рабочий наследует базовый рабочий класс, а базовый рабочий класс содержит чистые виртуальные функции, которые должны существовать во всех вариантах рабочих, а также несколько переменных, которые распределяются между всеми работниками.
class workerVariant : protected baseWorkerClass
{
public:
workerVariant(int id)
: id(id)
{
Director::manageWorker(this);
}
~workerVariant()
{
}
int getThreadID()
{
return id;
}
int getSomeVariable()
{
return someVariable;
}
protected:
int id;
int someVariable
};
Затем baseWorkerClass выглядит примерно так:
class baseWorkerClass
{
public:
baseWorkerClass()
{
}
~baseWorkerClass()
{
}
virtual int getThreadID() = 0;
virtual int getSomeVariable() = 0;
};
После каждого инициализации каждого рабочего варианта я должен получить массив указателей на объекты baseWorkerClass. Это означает, что я должен, например, получить значение данной переменной у определенного рабочего, используя свой идентификатор в качестве индекса для массива, например:
workerPtrArray[5]->getSomeVariable(); // Get someVariable from worker thread 5
Проблема в том, что этот код вызывает сбой в исполняемом файле Windows, без объяснения причин, и в Linux он говорит:
чистый виртуальный метод, называемый завершение вызова без активного исключения
Отменено
Я мог бы поклясться, что у меня это работало в какой-то момент, поэтому я смущен тем, что я испортил.
Фактический немодифицированный код, который имеет проблему:
Заголовок варианта работы: http://pastebin.com/f4bb055c8
Исходный файл варианта рабочего: http://pastebin.com/f25c9e9e3
Заголовок базового рабочего класса: http://pastebin.com/f2effac5
Исходный файл базового рабочего класса: http://pastebin.com/f3506095b
Заголовок заголовка: http://pastebin.com/f6ab1767a
Исходный файл режиссера: http://pastebin.com/f5f460aae
EDIT: дополнительная информация, в функции manageWorker, я могу вызвать любую из чистых виртуальных функций из указателя "рабочий", и он работает отлично. Вне функции manageWorker, когда я пытаюсь использовать массив указателей, он терпит неудачу.
EDIT: теперь, когда я думаю об этом, точкой входа потока является оператор(). Нить директора создается перед рабочими, что может означать, что перегруженный оператор скобки вызывает чистые виртуальные функции, прежде чем их можно переопределить дочерними классами. Я изучаю это.