2016-05-23 4 views
-1

У меня есть четыре потока с указателем 'this' как параметр потока. В этих потоках я вызываю одну и ту же функцию-член, используя reinterpret_casted this pointer. Эта функция-член использует переменные-члены (не статические) только для чтения. Но приложение потерпело крах, и дамп сбоя показал, что приложение разбилось при вызове функции-члена из потоков.Thread Synchronization and member function

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

Аналогичный код в thread2, Thread3 & Thread4, который изменяет различные переменные-члены.

+0

Это похоже на C++, но либеральное использование нестандартных типов делает моего подозреваемого не «std :: thread», который вы пытаетесь синхронизировать. У меня был удар по тегам, пожалуйста, поправьте меня, если я ошибусь. – MSalters

+1

MCVE так легко ответить –

ответ

0

Для вызова функции-члена требуется действительный указатель this, который reinterpret_cast может не дать вам. Этот кастинг - это действительно «Я знаю, что делаю, доверяю мне». И крушение подсказывает, что вы этого не сделали. Компилятор вслепую поверил MyClassPtr указателю на объект MyClass, и он явно этого не сделал.

Что до этого, об этом нельзя сказать. С этим типом Threading (Win32 native), вам решать, чтобы звезды выровнялись. Объект мог быть уничтожен в другом месте (C++ не содержит сборку мусора, он не сохранит объекты для вас). Из-за броска может возникнуть проблема смещения указателя.

+0

Да, я согласен с вашим комментарием. Я забываю упомянуть, что MyClass является независимым классом: у него нет наследования. Поэтому я думаю, что проблема смещения указателя может не произойти. Я прав? – aks

0

Довольно ясно, что MyClass был выделен на стек (автоматическое хранилище) или выделен на кучу, но позже удален до этой функции (MyFunc).

Или, очень возможно, что вы передали нить не MyClass, а что-то еще. Вы должны всегда передавать правильный тип и следить за тем, чтобы он оставался в памяти, чтобы поток использовал его.