线程同步和成员函数



我有四个线程,其中"this"指针作为线程参数。在这些线程中,我使用 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;
         }
     }
  }

Thread2、Thread3 和 Thread4 中的类似代码,用于修改不同的成员变量。

调用成员函数需要一个有效的this指针,reinterpret_cast可能不会给你。这个演员阵容真的是一个"我知道我在做什么,相信我"的演员阵容。坠机表明你没有。编译器盲目地相信MyClassPtr指向MyClass对象的指针,显然没有。

至于为什么,从这段代码中无法说出来。使用这种类型的线程(Win32 本机),由你来确保星星对齐。该对象可能在其他地方被销毁(C++没有垃圾回收,它不会为您保持对象存活)。由于强制转换,您可能遇到指针偏移问题。

很明显

MyClass是在堆栈(自动存储)上分配的,或者在堆上分配的,但后来在调用此函数(MyFunc)之前被删除。

或者,您传递给线程的内容很可能不是MyClass而是其他东西。应始终传递正确的类型,并确保它保留在内存中以供线程使用它。

最新更新