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

标签 c++ multithreading

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

我正在将结构“&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;
}

最佳答案

你猜对了。

您正在将一个局部变量的地址传递给您的 thread-proc-startup,然后离开作用域(并销毁进程中的对象)。在您的线程过程中对该对象的引用是此后未定义的行为。

new动态分配一个并让线程处理delete它。

关于c++ - 将结构对象作为参数传递给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14338470/

相关文章:

c++ - 如果类包含基类的成员,编译器可以利用空基优化吗?

Android - 当使用总线事件调用时,IntentService 在 UI 线程上运行

java - 如何完全停止包含缓冲读取器的线程?

c++ - 指向抽象类的指针 vector ,用于访问派生类成员

c++ - 如何使用 gtest 对 std::bind 函数进行单元测试?

Java Spring bean 创建另一个 bean 的更多实例

JAVA:经过这么多时间后中断线程

JavaFX从另一个线程访问gui按钮操作

c++ - 在C代码中添加到头文件时,全局数组没有 'type'

c++ - 将 char 指针初始化为字符串 vs 其他类型指针初始化为数组