Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

C++ 将结构对象作为参数传递给线程

C++ 将结构对象作为参数传递给线程,c++,multithreading,C++,Multithreading,这段代码成功运行,MQStruct构造函数也初始化了值,我可以在ExecuteThread函数中看到,但在TestFunction中,我得到了MQStruct的垃圾值 我正在为参数将struct“&MQStructObj”的地址传递给_beginthreadex,我想这就是问题所在 struct MQStruct { MQStruct() { pointer=NULL; serviceName=NULL; durability=0;

这段代码成功运行,MQStruct构造函数也初始化了值,我可以在ExecuteThread函数中看到,但在TestFunction中,我得到了MQStruct的垃圾值

我正在为参数将struct“&MQStructObj”的地址传递给_beginthreadex,我想这就是问题所在

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,那很好。再次感谢您精简代码以解决问题。正如你可能知道的那样,它使发现问题变得非常迅速。