2012-03-13 84 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