2014-12-06 4 views
0

Я пытаюсь передать структуру при создании потока, но, похоже, не работает правильно!Проходящие структуры в pthread

Вот структура:

struct analyse_data { 
    int verbose; //should be 1 or 0 
}; 

Обратите внимание, что многословен может быть только 1 или 0, и ничего другого.

Вот метод вызывается (обратите внимание, это можно назвать несколько раз другим методом):

void dispatch(struct pcap_pkthdr *header, const unsigned char *packet, 
     int verbose) { 

    static bool thread_settings_initialised = false; 

    printf("Verbose: %d\n", verbose); //Prints 1 or 0 

    //Only run the first time dispatch method runs 
    if (thread_settings_initialised == false){ 
     thread_settings_initialised = true; 

     //...  

     //Set mutex for the appropriate variables to remain thread safe 
     //... 

     //Set attr so threads are "Detached" 
     pthread_attr_init(&attr); 
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 

     //Set pthread_cond_init 
     //... 
    } 

    //Put parameters into a struct so can be sent in a thread 
    struct analyse_data data; 
    data.verbose = verbose; 

    //... 

    pthread_t tid; 
    printf("data.verbose: %d\n", data.verbose); //This prints 1 or 0 
    int rc = pthread_create(&tid, &attr, bar, (void *) &data); 
    if (rc) { 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
    } 

} 

и это метод, то будет называться по теме:

void analyse(void *thread_data) { 
    struct analyse_data *data; 
    data = (struct analyse_data *) thread_data; 
    int verbose = data->verbose; 
    printf("Verbose = %d\n", verbose); //Prints weird numbers like -547845... 
} 

As вы можете видеть из моих комментариев значение вещественных изменений при использовании внутри метода. Зачем? Что я делаю не так?

Большое спасибо!

Update (спасибо СП1) Я обновил свой код, чтобы использовать указатель:

void dispatch(struct pcap_pkthdr *header, const unsigned char *packet, 
     int verbose) { 

    static bool thread_settings_initialised = false; 

    printf("Verbose: %d\n", verbose); //Prints 1 or 0 

    //... 

    //Put parameters into a struct so can be sent in a thread 
    struct analyse_data *data = malloc(sizeof(struct analyse_data)); //NEW 
    data->verbose = verbose; 

    //... 

    pthread_t tid; 
    printf("data.verbose: %d\n", data.verbose); //This prints 1 or 0 
    int rc = pthread_create(&tid, &attr, bar, (void *) data); 
    //... 
} 

Но теперь анализировать() метод всегда выводит 0, даже если многословным это 1!

ответ

1

Вы не должны передавать переменную стека в pthread_create. Обратите внимание, что data является локальным для функции dispatch и будет недоступен, если возвращается dispatch. Вместо этого вы должны использовать malloc для распределения data или использовать статическую или глобальную переменную.

Если вы используете метод malloc, он будет выглядеть следующим образом:

struct analyse_data *data = malloc(sizeof(struct analyse_data)); 
data->verbose = verbose; 

int rc = pthread_create(&tid, &attr, bar, data); 

Вы должны помнить, чтобы не называть free на data от dispatch. Память должна «принадлежать» потоку, поэтому в конечном итоге вы должны позвонить free по адресу data из потока, когда вы закончите, используя содержимое data.

+0

это так: struct analyse_data * data = malloc (sizeof (struct analyse_data)); data-> verbose = verbose; ... int rc = pthread_create (& tid, & attr, анализ, (void *)); –

+0

Это выглядит правильно. – JS1

+0

Это работает лучше, но не совсем правильно. В первой подпрограмме (отправке) она выдает 1, как ожидалось, но во 2-м она всегда выводит 0! Я обновлю свой вопрос, чтобы отразить проблему –

Смежные вопросы