編集:解決済み
私は現在、マルチスレッドプロジェクトに取り組んでおり、ベースワーカークラスがあり、そこから継承するさまざまなワーカークラスがあります。実行時に、ワーカークラスはスレッドになり、スレッドは必要に応じて作業を実行します。
これで、すべてのワーカーへのポインターの配列を維持することになっているディレクターが作成されました。これにより、ワーカーから情報を取得したり、後でワーカー内の変数を変更したりできます。
これを行うには、基本クラスのポインターへのポインターを作成します。
baseWorkerClass** workerPtrArray;
次に、Directorのコンストラクターで、ポインターの配列を基本ワーカークラスに動的に割り当てます。
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オブジェクトへのポインターの配列ができあがります。これは、たとえば、次のように、IDを配列のインデックスとして使用して、特定のワーカーの特定の変数の値を取得できる必要があることを意味します。
workerPtrArray[5]->getSomeVariable(); // Get someVariable from worker thread 5
問題は、このコードが理由の説明なしにWindows実行可能ファイルでクラッシュを引き起こすことであり、Linuxでは次のように述べています。
アクティブな例外なしで呼び出されたterminateと呼ばれる純粋仮想メソッドが
中止 されました
ある時点でこれが機能していると誓うことができたので、何を台無しにしたのか混乱しています。
問題のある実際の変更されていないコード:
ワーカーバリアントヘッダー: http: //pastebin.com/f4bb055c8
ワーカーバリアントソースファイル: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スレッドはワーカーの前に作成されます。これは、オーバーロードされた括弧演算子が、子クラスによってオーバーライドされる前に純粋仮想関数を呼び出していることを意味する場合があります。私はこれを調べています。