2012-03-13 24 views
0

我正在爲來自客戶端的每個請求創建一個線程以獲取服務器上的文件。線程函數通常會得到一個void指針;但我需要給它一個字符指針作爲參數,並希望它由線程函數填充文件名。如何更改線程函數內的void *參數

代碼創建一個線程:

pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) thread_buff); 
pthread_join(thread_id, pt_ret); 

業。線程函數:

void *getfiles(void *ptr) { 
    /* ... */ 
    char buff[256]; // populating that local buffer with the file names 
    // ptr should be as a return of buff 
} 

線程完成後,我曾嘗試不同的事情,但每一次,thread_buff就像變成「Q」。

+1

沒有必要在C中拋出任何指向'void *'的指針。 – 2012-03-13 14:28:33

+0

請問您可以發佈更多代碼嗎? – Jay 2012-03-13 14:49:59

回答

2

它只是轉換爲一個char *,因爲你知道它實際上一個char *:

void *getfiles(void *ptr) { 
    /* ... */ 
    const char *ptr_char = (const char*)ptr; 
    char buff[256]; 
    memcpy(buff, ptr_char, 256); //just as an example, check the sizes. 
    //you could also strcpy, that's up to you 
} 

或者你也可以只由ptr指向的緩衝區的工作,但沒有照搬的,所以它的在線程結束後可以訪問:

void *getfiles(void *ptr) { 
    /* ... */ 
    char *buff = (char*)ptr; 
    /* do stuff with buff. */ 
} 
+0

它沒有工作。輸出仍然是'Q'。 – 2012-03-13 14:31:15

+0

編輯,檢查第二個解決方案。 – mfontanini 2012-03-13 14:31:59

+0

演員不需要和混淆。簡單地分配它。 – 2012-03-13 15:14:44

0

我想問題是你想使用存儲在線程的「buff」var中的數據線程結束後。這是不可能的,數據只在臨時堆棧上存在。

你要通過一個char ** PTR,並用淺黃色的副本填充它,如:

*ptr = strdup(buff) 

又通(無效*)& thread_buff代替(無效*)thread_buff的線程功能。

+0

他爲什麼需要傳遞指向char的指針?線程結束後,緩衝區仍然可用,如果他使用char * – mfontanini 2012-03-13 14:36:24

+0

以便thread_buff指向線程的buff var的副本。但是我必須承認,op的評論'ptr應該作爲buff的回報'令人困惑。 – huelbois 2012-03-13 14:43:16