【发布时间】:2011-01-11 03:50:16
【问题描述】:
编辑:已解决
我现在正在处理一个多线程项目,其中我有一个基础工作类,并从它继承了不同的工作类。在运行时,工作类变成线程,然后根据需要执行工作。
现在,我编写了一个 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 中,它说:
调用纯虚方法
在没有活动异常的情况下调用终止
中止
我本可以发誓我在某个时候可以正常工作,所以我对自己搞砸了什么感到困惑。
有问题的实际未修改代码:
Worker 变体标头:http://pastebin.com/f4bb055c8
Worker 变体源文件:http://pastebin.com/f25c9e9e3
基础工人类标题:http://pastebin.com/f2effac5
基础工作者类源文件:http://pastebin.com/f3506095b
导演头:http://pastebin.com/f6ab1767a
导演源文件:http://pastebin.com/f5f460aae
编辑:额外信息,在 manageWorker 函数中,我可以从指针“worker”调用任何纯虚函数,它工作得很好。在 manageWorker 函数之外,当我尝试使用指针数组时,它会失败。
编辑:现在我考虑一下,线程的入口点是 operator()。 Director线程是在worker之前创建的,这可能意味着重载的括号运算符在被子类覆盖之前正在调用纯虚函数。我正在研究这个。
【问题讨论】:
标签: c++ multithreading inheritance pure-virtual