编辑:已解决
我现在正在做一个多线程项目,我有一个基础工作类,其中有不同的工作类继承自它。在运行时,工作类成为线程,然后根据需要执行工作。
现在,我已经编写了一个 Director,它应该维护一个指向所有工作人员的指针数组,以便它可以从中检索信息,以及稍后修改其中的变量。
我通过创建一个指向基类指针的指针来做到这一点:
baseWorkerClass** workerPtrArray;
然后在 Director 的构造函数中,我动态分配一个指向基工作类的指针数组:
workerPtrArray = new baseWorkerClass*[numWorkers];
在每个worker线程的构造函数中,worker调用director中的一个函数,该函数旨在将该worker的指针存储在数组中。
以下是 director 存储指针的方式:
Director::manageWorker(baseWorkerClass* worker)
{
workerPtrArray[worker->getThreadID()] = worker;
}
这是一个工人变体的例子。每个worker都继承自基础worker类,基础worker类包含应该存在于所有worker变体中的纯虚函数,以及一些在所有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;
};
在每个 worker 变体完成初始化后,我应该得到一个指向 baseWorkerClass 对象的指针数组。这意味着我应该能够,例如,使用某个工作人员的 ID 作为数组的索引来获取给定变量的值,如下所示:
workerPtrArray[5]->getSomeVariable(); // Get someVariable from worker thread 5
问题是这段代码导致 Windows 可执行文件崩溃,没有任何解释原因,在 Linux 中,它说:
纯虚方法调用
terminate 调用时没有活动异常
Aborted
我本可以发誓我在某个时候可以做到这一点,所以我对自己搞砸了什么感到困惑。
有问题的实际未修改代码:
Worker 变体头文件:http: //pastebin.com/f4bb055c8
Worker 变体源文件: http: //pastebin.com/f25c9e9e3
基础工作者类头文件:http: //pastebin.com/f2effac5
基础工作者类源文件: http: //pastebin.com/f3506095b
Director 头文件:http: //pastebin.com/f6ab1767a
Director 源文件: http: //pastebin.com/f5f460aae
编辑:额外信息,在 manageWorker 函数中,我可以从指针“worker”调用任何纯虚函数,它工作得很好。在 manageWorker 函数之外,当我尝试使用指针数组时,它会失败。
编辑:现在我考虑一下,线程的入口点是 operator()。Director线程是在worker之前创建的,这可能意味着重载的括号运算符在被子类覆盖之前正在调用纯虚函数。我正在调查这个。