マルチスレッドプログラミングではあまりよくありませんので、いくつかのヘルプ/アドバイスをお願いしたいと思います。マルチスレッドアプリケーションでのアクセス違反、C++
私のアプリケーションでは、共有オブジェクトにアクセスしようとするスレッドが2つあります。 別のオブジェクト内から関数を呼び出そうとする2つのタスクについて考えることができます。わかりやすくするために、私はプログラムのいくつかの部分を示しますが、それはあまり関連性がないかもしれませんが、うまくいけば私の問題をより良くすることができます。
以下のサンプルコードを見てください:
iDataLinkLayerはDataLinkLayerオブジェクトのisntanceに純粋仮想関数および参照(ポインタ)の宣言を含むインタフェース(任意実装せずに抽象クラス)である//DataLinkLayer.h
class DataLinkLayer: public iDataLinkLayer {
public:
DataLinkLayer(void);
~DataLinkLayer(void);
};
を(dataLinkLayer)。
// DataLinkLayer.cpp
#include "DataLinkLayer.h"
DataLinkLayer::DataLinkLayer(void) {
/* In reality task constructors takes bunch of other parameters
but they are not relevant (I believe) at this stage. */
dll_task_1* task1 = new dll_task_1(this);
dll_task_2* task2 = new dll_task_2(this);
/* Start multithreading */
task1->start(); // task1 extends thread class
task2->start(); // task2 also extends thread class
}
/* sample stub functions for testing */
void DataLinkLayer::from_task_1() {
printf("Test data Task 1");
}
void DataLinkLayer::from_task_2() {
printf("Test data Task 2");
}
タスク1の実装は以下のとおりです。 dataLinLayerインターフェース(iDataLinkLayer)ポインターは、dataLinkLayerの中から必要な機能にアクセスできるように、クラスcosInstructorに渡されます。
//data_task_1.cpp
#include "iDataLinkLayer.h" // interface to DataLinkLayer
#include "data_task_1.h"
dll_task_1::dll_task_1(iDataLinkLayer* pDataLinkLayer) {
this->dataLinkLayer = pDataLinkLayer; // dataLinkLayer declared in dll_task_1.h
}
// Run method - executes the thread
void dll_task_1::run() {
// program reaches this point and prints the stuff
this->datalinkLayer->from_task_1();
}
// more stuff following - not relevant to the problem
...
とタスク2 simialrlyなります
//data_task_2.cpp
#include "iDataLinkLayer.h" // interface to DataLinkLayer
#include "data_task_2.h"
dll_task_2::dll_task_2(iDataLinkLayer* pDataLinkLayer){
this->dataLinkLayer = pDataLinkLayer; // dataLinkLayer declared in dll_task_2.h
}
// // Run method - executes the thread
void dll_task_2::run() {
// ERROR: 'Access violation reading location 0xcdcdcdd9' is signalled at this point
this->datalinkLayer->from_task_2();
}
// more stuff following - not relevant to the problem
...
私が正しく理解してように、私は2つの異なるスレッド(タスク)から共有ポインタにアクセスし、それが許可されていません。 しかし、私はオブジェクトにアクセスすることができると思っていましたが、結果は予期しないものになる可能性があります。
dll_task_2がDataLinkLayerへのポインタを使って関数を呼び出そうとすると、何かがひどく間違っているようです。 dll_task_2は優先度が低く、その後に開始されます。なぜ私はまだオブジェクトにアクセスできないのか分かりません... mutexを使って変数をロックすることができますが、主な理由は変数/オブジェクトを保護することだと思いました。
私はMicrosoft Visual C++ 2010 Expressを使用しています。 私はマルチスレッドについてあまりよく知らないので、この問題のより良い解決策を提案し、問題の理由を説明することもできます。
2番目のスレッドが実行される前に、プログラムがDataLinkLayerオブジェクトを破棄している可能性があります。あなたは 'main()'のように見えますか? –
'this-> datalinklayer'はおそらく無効なアドレスを含んでいます。デバッガでその値を確認できますか? – casablanca
スレッドを生成するコードはありません。 –