Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程同步和成员函数_C++_Multithreading_Winapi_Visual C++_Synchronization - Fatal编程技术网

C++ 线程同步和成员函数

C++ 线程同步和成员函数,c++,multithreading,winapi,visual-c++,synchronization,C++,Multithreading,Winapi,Visual C++,Synchronization,我有四个以“this”指针作为线程参数的线程。 在这些线程中,我使用重新解释这个指针调用相同的成员函数。此成员函数使用成员变量(非静态)进行只读。但是应用程序崩溃了,崩溃转储显示应用程序在从线程调用成员函数时崩溃了 DWORD MyClass::Thread1( LPVOID ParamPtr ) { MyClass* MyClassPtr = reinterpret_cast<MyClass*>( ParamPtr ); for(i......) {

我有四个以“this”指针作为线程参数的线程。 在这些线程中,我使用重新解释这个指针调用相同的成员函数。此成员函数使用成员变量(非静态)进行只读。但是应用程序崩溃了,崩溃转储显示应用程序在从线程调用成员函数时崩溃了

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;
         }
     }
  }
DWORD MyClass::Thread1(LPVOID ParamPtr)
{
MyClass*MyClassPtr=重新解释(参数PTR);
(我……)
{
(j…)
{
//a.b.c是局部变量
MyClassPtr->MyFunc(a,b,c);member1=1;
}
}
}

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

调用成员函数需要一个有效的
指针,而
重新解释\u cast
可能不会提供给您。那个演员真的是“我知道我在做什么,相信我”的演员。坠机事件表明你没有。编译器盲目地相信
MyClassPtr
指向
MyClass
对象的指针,显然它不相信


至于为什么,这是不可能从这个代码说。使用这种类型的线程(Win32 native),您可以确定星星是否对齐。该对象可能在其他地方被销毁(C++没有垃圾收集,它不会让对象保持活动状态)。由于强制转换,您可能存在指针偏移问题

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


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

这看起来像C++,但是对非标准类型的自由使用使我的怀疑不是代码> STD::线程< /C> >你试图同步。我尝试了一下标签,如果我猜错了,请纠正我。MCVE会让这很容易回答是的,我同意你的评论。我忘了提到MyClass是一个独立的类:它没有继承。因此,我认为指针偏移问题可能不会发生。我说得对吗?