2016-05-23 31 views
-1

我有四個線程,'this'指針作爲線程參數。 在這些線程中,我使用reinterpret_casted這個指針調用相同的成員函數。此成員函數使用成員變量(非靜態)僅用於讀取。但是應用程序崩潰並且崩潰轉儲顯示從線程調用成員函數時應用程序崩潰。線程同步和成員函數

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; 
     } 
    } 
    } 

類似的代碼在線程2,Thread3 & Thread4其中修改不同成員變量。

+0

這看起來確實像C++,但是非標準類型的自由使用使得我懷疑它不是你試圖同步的'std :: thread'。我刺戳了標籤,如果我猜錯了,請糾正我。 – MSalters

+1

MCVE可以很容易回答 –

回答

0

調用成員函數需要一個有效的this指針,reinterpret_cast可能不會給你。演員陣容真的是「我知道我在做什麼,相信我」演員。事故表明你沒有。編譯器盲目地認爲指向MyClass對象的指針MyClassPtr,但它顯然沒有。

至於爲什麼,這是不可能從這段代碼說。使用這種線程(Win32 native),你可以確定星星是否對齊。該對象可能在其他地方被銷燬(C++沒有垃圾收集,它不會讓對象保持活着)。由於演員陣容,您可能會遇到指針偏移問題。

+0

是的,我同意你的評論。我忘了提及MyClass是一個獨立的類:它沒有繼承。所以我認爲指針偏移問題可能不會發生。我對嗎? – aks

0

很明顯,MyClass被分配在堆棧(自動存儲)上,或分配在堆上,但在調用此函數(MyFunc)之前被刪除。

或者,您傳遞給線索的非常有可能不是MyClass,而是其他內容。您應該始終傳遞正確的類型,並確保它保留在內存中供線程使用。