Я пытаюсь передать структуру при создании потока, но, похоже, не работает правильно!Проходящие структуры в 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!
это так: struct analyse_data * data = malloc (sizeof (struct analyse_data)); data-> verbose = verbose; ... int rc = pthread_create (& tid, & attr, анализ, (void *)); –
Это выглядит правильно. – JS1
Это работает лучше, но не совсем правильно. В первой подпрограмме (отправке) она выдает 1, как ожидалось, но во 2-м она всегда выводит 0! Я обновлю свой вопрос, чтобы отразить проблему –