Указатель теряется, когда выделенная структура с указателем на выделенную строку передается в качестве аргумента для pthread - PullRequest
0 голосов
/ 20 ноября 2010

Я пишу сервер, который запускает поток для каждого входящего запроса.Я хочу передать ветки запроса и некоторые другие вещи в ветку.Для этого я использую структуру, которая выделена и содержит указатель, который указывает на выделенную строку.Я делаю так, чтобы сохранить структуру живой для потока, даже когда основной поток входит в свой следующий цикл.Когда я передаю указатель на эту структуру в мой поток, указатель в структуре, который должен указывать на строку, «теряет» свою информацию.Ну, я получаю EXC_BAD_ACCESS и понятия не имею, почему.

Любая помощь приветствуется: -)

typedef struct _thdata
{
    int socket;
    int thread_no;
    char *parameter;
}thdata;

void *thread_function(thdata *data)
{
    printf("Thread %i: got:%s\n",
            data->thread_no, data->parameter);<-EXC_BAD_ACCESS
    ...
    free data->parameter;
    free data;
    pthread_exit((void *)0);
}

int main(...)
{   ...
    while(1){
    ...
       thdata *data;
       data = (thdata*)malloc(sizeof(data));
       data->socket=connSocket;
       data->thread_no=i;
       data->parameter=(char*)malloc(strlen(param)+1);
       strcpy(data->parameter, param);
    ...
       pthread_create( &p_thread, NULL, (void *(*)(void *))thread_function, 
                    (void*) &data);
    ...
    }
}

1 Ответ

4 голосов
/ 20 ноября 2010

Вы передаете адрес указателя , то есть указателя на указатель на pthread_create, но вы хотите передать адрес вашего _thdata объект. Вам нужно передать указатель на сам объект, например:

pthread_create(&p_thread, NULL, thread_function, data);

Кроме того, здесь нет необходимости приводить к void*.

...