C++ 线程同步和成员函数
我有四个以“this”指针作为线程参数的线程。 在这些线程中,我使用重新解释这个指针调用相同的成员函数。此成员函数使用成员变量(非静态)进行只读。但是应用程序崩溃了,崩溃转储显示应用程序在从线程调用成员函数时崩溃了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......) {
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是一个独立的类:它没有继承。因此,我认为指针偏移问题可能不会发生。我说得对吗?