C++ 将结构对象作为参数传递给线程
这段代码成功运行,MQStruct构造函数也初始化了值,我可以在ExecuteThread函数中看到,但在TestFunction中,我得到了MQStruct的垃圾值 我正在为参数将struct“&MQStructObj”的地址传递给_beginthreadex,我想这就是问题所在C++ 将结构对象作为参数传递给线程,c++,multithreading,C++,Multithreading,这段代码成功运行,MQStruct构造函数也初始化了值,我可以在ExecuteThread函数中看到,但在TestFunction中,我得到了MQStruct的垃圾值 我正在为参数将struct“&MQStructObj”的地址传递给_beginthreadex,我想这就是问题所在 struct MQStruct { MQStruct() { pointer=NULL; serviceName=NULL; durability=0;
struct MQStruct {
MQStruct()
{
pointer=NULL;
serviceName=NULL;
durability=0;
msgType=0;
msgHeader=0;
msgId=NULL;
payload=NULL;
payloadSize=0;
ttl=0;
priority=0;
}
void* pointer;
wchar_t *serviceName;
int durability;
int msgType;
int msgHeader;
wchar_t *msgId;
wchar_t *payload;
int payloadSize;
int ttl;
int priority;
};
int ExecuteThread() {
HANDLE heartBeatThread;
unsigned int hbThreadID;
int result = 0;
MQStruct MQStructObj;
MQStructObj.pointer=this;
heartBeatThread = (HANDLE)_beginthreadex(NULL, 0 , &TestFunction, &MQStructObj, 0/*CREATE_SUSPENDED*/, &hbThreadID);
if ( heartBeatThread == 0 )
{
result = -1;
LogEvent(DEBUG_LOG,0, "Fail to create thread");
}
CloseHandle(heartBeatThread);
return result;
}
你猜对了
将局部变量的地址传递给线程进程启动,然后离开作用域(并在进程中销毁对象)。在线程进程中对该对象的引用在未定义的行为之后
用new
动态分配一个,让线程执行删除它。你猜对了
将局部变量的地址传递给线程进程启动,然后离开作用域(并在进程中销毁对象)。在线程进程中对该对象的引用在未定义的行为之后
使用new
动态分配一个,并让线程执行删除它。MQStructObj
在堆栈上声明,因此将超出范围,并可能在ExecuteThread
完成后立即被覆盖
如果要在此处使用堆栈对象,则需要添加一些同步,以允许新线程在ExecuteThread
返回之前从MQStructObj
复制
或者,通常最好是动态分配MQStructObj
,让新线程在空闲时清理它
MQStruct* MQStructObj = new MQStruct();
MQStructObj->pointer=this;
heartBeatThread = (HANDLE)_beginthreadex(NULL, 0 , &TestFunction, MQStructObj, 0, &hbThreadID);
if ( heartBeatThread == 0 ) { // error
delete MQStructObj;
result = -1;
}
// ownership of MQStructObj transferred to new thread
MQStructObj
在堆栈上声明,因此将超出范围,并可能在ExecuteThread
完成后立即被覆盖
如果要在此处使用堆栈对象,则需要添加一些同步,以允许新线程在ExecuteThread
返回之前从MQStructObj
复制
或者,通常最好是动态分配MQStructObj
,让新线程在空闲时清理它
MQStruct* MQStructObj = new MQStruct();
MQStructObj->pointer=this;
heartBeatThread = (HANDLE)_beginthreadex(NULL, 0 , &TestFunction, MQStructObj, 0, &hbThreadID);
if ( heartBeatThread == 0 ) { // error
delete MQStructObj;
result = -1;
}
// ownership of MQStructObj transferred to new thread
我已经编辑了你的标题。请看,其中的共识是“不,他们不应该”。我已经编辑了你的标题。请看,这里的共识是“不,他们不应该”。您的意思是像这样的MQStruct*MQStructObj=newmqstruct()@沙赫扎德:没错。只要确保删除它,最有可能是在线程进程中,当完成它时。另外,我注意到你没有对该对象中的任何其他成员做任何事情。如果这是因为您在发布之前删除了此处的所有相关代码,谢谢。如果不是,你也可以把<代码> < <代码>作为线程PARAM(这在C++架构中非常常见,使用线程,BTW)。我使用所有元素,但只是为了POST,使它变短,我只显示了一个属性。谢谢:)@Shahzad,那很好。再次感谢您精简代码以解决问题。正如您可能知道的那样,它使查找问题变得非常迅速@沙赫扎德:没错。只要确保删除它,最有可能是在线程进程中,当完成它时。另外,我注意到你没有对该对象中的任何其他成员做任何事情。如果这是因为您在发布之前删除了此处的所有相关代码,谢谢。如果不是,你也可以把<代码> < <代码>作为线程PARAM(这在C++架构中非常常见,使用线程,BTW)。我使用所有元素,但只是为了POST,使它变短,我只显示了一个属性。谢谢:)@Shahzad,那很好。再次感谢您精简代码以解决问题。正如你可能知道的那样,它使发现问题变得非常迅速。