2011-12-24 56 views
-1

我面對的C++並行線程一個奇怪的錯誤,我嘗試運行這段代碼:一些奇怪的事情,在C++ POSIX線程

typedef struct 
{ 
    struct sockaddr_in clienAddr; 
    int clientLength; 
    string message; 
}param; 

pthread_t clientThread; 

param sentParam ; 
sentParam.clienAddr = clientAddress; 
sentParam.clientLength= client_info; 
sentParam.message=buffString; 

cout <<"sentParam: "<<sentParam.message<<endl; 
// it prints well. 

int i = pthread_create(&clientThread, NULL, handleClientRequestRead,&sentParam); 
cout <<"i: "<<i<<endl; 
the function which be called 

void* handleClientRequestRead(void* params) 
{ 
    // cout<<"params: "<< ; 
    string msg = ((param *)(params))->message; 
} 

當我嘗試打印味精它是空的。任何幫助將不勝感激

+0

您必須確保'sentParam'只要生活爲主線(這通常意味着然後結束程序的)。 –

回答

1

我@Matteo以上同意:

struct param 
{ 
    struct sockaddr_in clienAddr; 
    int clientLength; 
    string message; 
}; 


void someFunction() 
{ 
    static int sentCount = 0; 
    static param sentParam[10]; 
// ^^^^^^ Notice these are static 
//   Thus they will last the length of the program. 
//   An alternative is to dynamically creation but then you have 
//   to destroy them at some point. 
// 


    if (count >= 10) 
    { throw std::runtime_error("Too many threads"); 
    } 
//   If you want to keep more than 10 or use a dynamic number 
//   then use a std::list, NOT a std::vector 

    sentParam[sentCount].clienAddr = clientAddress; 
    sentParam[sentCount].clientLength= client_info; 
    sentParam[sentCount].message=buffString; 

    cout <<"sentParam: "<<sentParam.message<<endl; 
    // it prints well. 


    pthread_t clientThread; 
    int i = pthread_create(&clientThread, NULL, handleClientRequestRead,&sentParam[sentCount]); 
    cout <<"i: "<<i<<endl; 

    if (i == 0) 
    { 
     ++sentCount; 
    } 
} 
+0

@Lokai Astrai但如果我將結構定義爲靜態,是不是這意味着每次調用的函數都採用相同的值? –

+0

@AdamJohns:靜態編號表示在第一次調用函數時(並且僅在第一次)初始化它。但它活到應用程序的最後。當您返回並重新輸入函數時,靜態變量中的值與您離開時的值相同(將其視爲全局變量(根據生命週期),但只能在函數內部看到它們)。 –

+0

AdamJohns:請接受@Matteo Italia他有真正的答案我只是擴大了他所說的內容,未來的問題讀者應該首先看到他的答案,因爲這將幫助他們更多地添加更多信息。 –

6

我的猜測是,當handleClientRequestRead被稱爲sentParam已經超出了範圍,其內存已被用於其他目的。

你應該爲你的參數分配內存,當你從線程訪問它的時候它仍然是有效的(例如,在堆上,記住當你不需要它的時候你必須釋放它) ;有效的幫助可以是shared_ptr)。

順便說一句,在C++中,你不需要typedef技巧struct s。

+0

+1,我的猜測也是如此。 –

+0

你能通過代碼澄清 –

+0

@AdamJohns:我的答案中有哪些不清楚? –