2013-04-04 30 views
0

我正在處理一個多線程應用程序,其中客戶端程序生成請求線程,將字符串發送到數據服務器程序,該程序通過發回字符串來回答。不幸的是,我無法將數據從客戶端的主函數傳遞給每個請求線程調用的函數。在主,我獲得請求的線程會是這樣的(以前的一些變量聲明中未示出):爲什麼我的字符串不能正確地傳遞給這個線程調用的函數?

for(int j = 0; j < persons.size(); j++){ //requests deal with imaginary people 
thread_args* dat = new thread_args; 
strcpy(dat->str, persons[j].c_str()); 

cout << "***I COPIED " << dat->str << " INTO dat->str!!!"<<endl; //prints as expected 

pthread_create(&request_thread[j],NULL,&deposit_requests, &dat); 
} 

具體來說,我使用傳遞的東西與線程的結構是這樣的:

typedef struct str_thdata{ 
    char str[100]; 
} thread_args; 

現在,在主要內容(「*** I COPIED ...」)內,一切都很好。正確的值是確實複製當我到由線程中調用的實際功能,不過,該字符串丟失:

void* deposit_requests(void* str_arg){ 

     for(int i = 0; i < req_per_person; i++){ 
     thread_args* data = (thread_args*)str_arg; 
     cout << "data->str is " << data->str << endl; //empty string!!! 
     ...  
     } 
    } 

我唯一的想法是,或許真的是走出去的範圍有多大?除非我在這裏失明,否則我不會看到會發生什麼。或者,也許我需要額外投射某處?我在第二個cout中嘗試了一些變體(例如,使用((thread_args *)數據) - > str)),但這似乎不起作用。我的角色數組發生了什麼?

回答

2

&您在pthread_create中傳遞的dat是指向thread_args結構的指針的地址,而不是thread_args結構的地址。

將dat沒有&傳遞給pthread_create,然後您的代碼爲deposit_requests應該運行良好。

pthread_create(&request_thread[j],NULL,&deposit_requests, dat); 
+0

其他人指出,但後來他們的帖子消失了,那個dat是另一個線程的棧幀上的局部變量。當您使用&來傳遞它時,您將傳遞一個指向實體的指針,該實體一旦名爲pthread_create的函數結束就會消失。但是,通過傳遞dat,您可以將指針傳遞給堆分配的實體,直到釋放它爲止。 – 2013-04-05 00:05:10

+0

'別人'也許意識到調用pthread_create的函數可能永遠不會結束,在這種情況下,實體不會消失。這種擔心在一般情況下是有效的,但不是鎖定。 – 2013-04-05 09:26:58

相關問題