У меня есть следующий код, который вызывает ошибку *** glibc detected *** free(): invalid pointer
всякий раз, когда я запускаю код.*** glibc detected *** free(): invalid pointer
main.h
:
#ifndef PTHREAD_CALC_H_
#define PTHREAD_CALC_H_
void* task(void*);
#endif
main.cxx
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
#include "main.h"
int main(int argc, char* argv[]) {
pthread_t *threads = (pthread_t*)malloc(sizeof(pthread_t)*2);
double *temp;
double sum = 0.0;
for (int j = 0; j < 2; j++) {
pthread_create(&(threads[j]), NULL, task, NULL);
}
for (int j = 0; j < 2; j++) {
pthread_join(threads[j], (void**)(&temp));
sum += *temp;
}
free(threads);
free(temp);
return 0;
}
void* task(void *data) {
double sum = 5;
pthread_exit((void*)&sum);
return NULL;
}
Я с трудом определяют, что является причиной ошибки. Любая помощь очень ценится. Если я могу предоставить что-нибудь еще, чтобы помочь выявить проблему, пожалуйста, дайте мне знать.
Спасибо
Редактировать
Ради завершенности, здесь результирующий код, который выполняется, как ожидалось:
main.cxx
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
#include "main.h"
int main(int argc, char* argv[]) {
pthread_t *threads = (pthread_t*)malloc(sizeof(pthread_t)*2);
double *temp;
double sum = 0.0;
for (int j = 0; j < 2; j++) {
pthread_create(&(threads[j]), NULL, task, NULL);
}
for (int j = 0; j < 2; j++) {
pthread_join(threads[j], (void**)&temp);
sum += temp;
delete temp;
}
free(threads);
return 0;
}
void* task(void *data) {
double* sum = new double;
*sum = 5.0;
pthread_exit(static_cast<void*>(sum));
}
неродственной, но вы передаете назад ссылку просуммировать из задачи , но сумма находится в стеке. Эта переменная может не существовать, когда вы добавляете ее в переменную sum в main. – MWB
@MWB не является точкой 'pthread_join()'? Он блокирует родительский поток до завершения задачи. Это заставляет меня думать, что 'sum' должно существовать, и его значение должно храниться в' temp' –
На странице man (http://man7.org/linux/man-pages/man3/pthread_exit.3.html) Значение, указанное retval, не должно находиться в стеке вызывающего потока, так как содержимое этого стека не определено после завершения потока. – MWB