Как изменить параметр void * внутри функции потока - PullRequest
0 голосов
/ 13 марта 2012

Я создаю поток для каждого запроса от клиента, чтобы получить файлы на сервере.Функция потока обычно получает пустой указатель;но мне нужно дать ему указатель на символ в качестве параметра и сделать так, чтобы он был заполнен именами файлов функцией потока.

Код создает поток:

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

Def.функции потока:

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'.

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Просто бросьте его на символ *, поскольку вы знаете, что на самом деле - это символ *:

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 голосов
/ 13 марта 2012

Я думаю, что проблема в том, что вы хотите использовать данные, хранящиеся в "буфере" вашего потока, ПОСЛЕ того, как поток заканчивается. Что невозможно, данные существуют только в стеке временно.

Вы должны передать char ** ptr и заполнить его копией баффа, например:

*ptr = strdup(buff)

И передать (void *) & thread_buff вместо (void *) thread_buff в функцию потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...