1. 程式人生 > >CreateThread執行緒傳遞結構體引數

CreateThread執行緒傳遞結構體引數

宣告一個結構體: 

struct Info 
{ 
    CString strInfo; 
    int nCopunt; 
}; 

在CPP檔案在建立一個執行緒:

    Info info;
    info.nCopunt = 100;
    CString str;
    str = "Hello";
    info.strInfo = str;
    HANDLE hThread = CreateThread(NULL, 0, ThreadProc,&info,0,0);

執行緒函式:

DWORD WINAPI ThreadProc(PVOID pParam)
{
    Info* pInfo = (Info*)pParam;
    return 0;
}

按照上面的寫法,會發現線上程函式當中 pInfo獲取的資訊是亂碼;  原因:  **建立執行緒之後已經過了info這個變數的作用域,線上程函式獲取的時候,Info變數已經不存在了;  為了保證執行緒訪問資料爭取,必須保證了info的空間在堆上,pInfo指向的資料也放堆上,保證執行緒訪問的時候資料有效;**

改進方法:

1:Info info;放到成員變數(這一種個人感覺 如果併發量大,可能info成員變數的值線上程訪問時已經被覆蓋,不過計算機的效能應該可以處理過來;)  2:Info* info = new Info;變數要在堆上;

一種是指向成員變數(保證在傳遞完以前不銷燬),另外就是傳遞的結構體自己有這個記憶體儲存空間