将结构对象作为参数传递给线程
passing structure object as parameter to a thread
这段代码成功运行,MQStruct构造器也初始化了这些值,我可以在ExecuteThread函数中看到,但在TestFunction中,我得到了MQStruct的垃圾值。
我正在传递结构体"&MQStructObj"的地址_beginthreadx的参数,这是我猜的问题
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;
}
你猜对了。
将局部变量的地址传递给thread-proc-startup,然后离开作用域(并在进程中销毁对象)。在你的线程进程中对这个对象的引用是在未定义行为之后的。
动态分配一个与new
,并让线程进程delete
它。
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
相关文章:
- 如何将带有参数的方法传递给线程以执行?
- 如何将参数传递给已经开始运行的线程
- 带参数的线程调用库函数
- 在 C++11 中,如何不将参数传递给线程
- 传递给线程更改的参数
- 多个线程传递参数
- 将一个方法作为参数传递给另一个方法,该方法本身将传递的方法传递给 std 线程
- POSIX线程,将多个参数传递给具有结构的函数
- C 11-当我将局部变量作为参数传递到线程中时,它是否安全
- 将参数传递给线程函数(模板)
- 如何要求接口中参数的线程安全
- 多线程 C++ 将参数传递给函数
- 如何在不将类数据成员作为参数传递的情况下访问线程中的类数据成员
- 在多线程处理时将参数传递给函数
- 线程传递字符串参数的布尔函数
- std::目标获取指针参数的线程错误
- std::带可移动、不可复制参数的线程
- std::使用类参数的线程初始化会导致类对象被多次复制
- 使用动态参数创建线程
- 传递线程例程多个变量和堆栈大小