2016-05-23 8 views
-1

スレッドパラメータとして 'this'ポインタを持つ4つのスレッドがあります。 これらのスレッドでは、reinterpret_casted thisポインタを使用して同じメンバ関数を呼び出しています。このメンバ関数は、読み込み専用のメンバ変数(非静的)を使用します。しかし、アプリケーションがクラッシュし、クラッシュダンプは、スレッドからメンバー関数を呼び出すときにアプリケーションがクラッシュしたことを示します。異なるメンバー変数を修正スレッド2にスレッド同期とメンバ関数

DWORD MyClass::Thread1(LPVOID ParamPtr) 
{ 
    MyClass* MyClassPtr = reinterpret_cast<MyClass*>(ParamPtr); 
    for(i......) 
    { 
     for(j.....) 
     { 
      // a.b.c are local variables 
      MyClassPtr->MyFunc(a, b, c); <- Crashed 
      ............... 
      MyClassPtr->member1 = 1; 
     } 
    } 
    } 

同様コード、Thread3 & Thread4。

+0

これは確かにC++に似ていますが、非標準型のリベラルな使い方は、あなたが同期しようとしているのは 'std :: thread'ではないことを容疑者にしています。タグに刺し傷がありましたが、私が間違っていれば私を修正してください。 – MSalters

+1

MCVEはこれに簡単に答えます –

答えて

0

メンバー関数を呼び出すには、有効なthisポインタが必要です。reinterpret_castは、あなたに与えられない可能性があります。そのキャストは本当に "私がやっていることを知っている、私を信じて"キャストです。そしてクラッシュは、あなたがしなかったことを示唆しています。コンパイラは、曖昧にMyClassPtrMyClassオブジェクトへのポインタを信じていましたが、明らかにそうではありませんでした。

理由は、このコードからは言えません。このタイプのスレッド(Win32ネイティブ)では、星が整列しているかどうかはあなた次第です。オブジェクトは他の場所で破壊されている可能性があります(C++にはガベージコレクションがありません。オブジェクトはあなたのために生き残りません)。キャストのために、ポインタオフセットの問題が発生することがあります。

+0

はい、あなたのコメントに同意します。 MyClassは独立したクラスであることに言及することを忘れています。継承はありません。だから、私はポインタのオフセットの問題が発生しないと思う。私は正しい? – aks

0

MyClassは、スタック(自動保存)に割り当てられた、またはヒープ上に割り当てられますが、この機能(MyFunc)が呼び出される前に、後に削除されたことはかなり明白です。

スレッドに渡されたものがMyClassではなく他のものである可能性が非常に高いです。あなたは常に正しい型を渡し、スレッドがそれを使用するためにメモリに残っていることを保証するべきです。