2013-01-15 66 views
1

該代碼成功運行並且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; 
} 
+0

我編輯了自己的冠軍。請參閱[「應該在其標題中包含」標籤「?」](http://meta.stackexchange.com/questions/19190/),其中的共識是「不,他們不應該」。 – Default

回答

2

你猜對了。

您正在將一個局部變量的地址傳遞給您的thread-proc-startup,然後留下作用域(並在該進程中銷燬該對象)。在你的線程proc中引用這個對象是存在的 - 在未定義的行爲之後。

動態分配一個與new並讓線程處理它delete它。

+0

你的意思是像這樣MQStruct * MQStructObj = new MQStruct(); – Shahzad

+0

這工作「MQStruct * MQStructObj =新的MQStruct();」 – Shahzad

+0

@Shahzad正確。在完成它的時候,確保'刪除'它,最有可能*在你的線程中。另外,我注意到你沒有對你的任何其他成員做任何事情。如果這是因爲您在發佈之前刪除了所有相關代碼,*謝謝*。如果不是的話,你可以把'this'作爲線程參數(這在使用線程的C++體系結構中很常見)。 – WhozCraig

2

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 
相關問題