我讀了很多malloc.c:3096:smsMALLOc: topiccs,但我找不到任何解決方案,我的問題。我的頭放棄了用這種能力工作,我問你。這裏是:另一個malloc.c:3096:與pthreads和mqueue sYSMALLOc問題
我有sensors.h
sensors.c
和main.c
文件。我想在消息隊列中的不同文件(sensors.c和main.c)中的兩個函數(線程)之間交換消息。 gcc編譯器編譯它wihtout任何錯誤像往常一樣,但試圖運行它的時候,我收到斷言錯誤malloc.c:3096: sYSMALLOc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins.....
file:sensor.h
typedef struct vector {
double x;
double y;
double z;
} vector_t;
typedef struct all_vectors {
vector_t *gyro;
vector_t *accel;
vector_t *magnet;
} vectors_t;
file:main.c:
#include "sensors.h"
vectors_t *vectors; // global
pthread_t threads[3];
int rc;
int main()
{
....
vectors = (vectors_t *)malloc(sizeof(vectors_t *));
vectors->gyro = (vector_t *)malloc(sizeof(vector_t *));
vectors->accel = (vector_t *)malloc(sizeof(vector_t *));
vectors->magnet = (vector_t *)malloc(sizeof(vector_t *));
....
mq_attribute.mq_msgsize = sizeof(vectors_t *);
mq_attribute.mq_maxmsg = 10;
mq_attribute.mq_curmsgs = 0;
mq_attribute.mq_flags = 0;
....
mqd1 = mq_open(mq_name1, O_RDWR | O_CREAT , 0777, &mq_attribute); // create mq
rc = pthread_create(&threads[0], NULL, (void *) &readSensors, (void *) vectors);
...
}
void readSensors(void *data)
{
vectors_t *vecs = (vectors_t *)data;
mqd_t mqd_send = mq_open(mq_name1, O_WRONLY);
printf("readSensors mq_open mq_name1: %s\n", strerror(errno));
while(loop)
{
readGyro(vecs->gyro);
readAccel(vecs->accel);
readMagnet(vecs->magnet);
mq_send(mqd_send, (char *) vecs, sizeof(vectors_t *), 1);
printf("readSensors mq_send mq_name1: %s\n", strerror(errno));
}
pthread_exit((void*) 0);
}
當我用gdb運行它,它給出了錯誤,而乳寧此行rc = pthread_create(&threads[0], NULL, (void *) &readSensors, (void *) vectors);
當然,我使用pthread_
和mq_
函數的返回值,我在這裏沒有提到爲了最小化代碼。我正在使用Raspberry Pi,我認爲好的程序valgrind不能在Raspberry上運行。
謝謝。
好的,謝謝你的回覆。我會嘗試。 –