另一个malloc.c:3096:带有pthreads和mqueue的sYSMALLOc问题

时间:2014-01-18 00:40:55

标签: c multithreading pthreads malloc assertion

我阅读了很多 malloc.c:3096:sYSMALLOc:主题,但我找不到任何解决方案。我问你,我的脑袋放弃了工作。这是:

我有sensors.h sensors.cmain.c个文件。我想在消息队列中的不同文件(sensors.c和main.c)中的两个函数(线程)之间交换消息。 gcc编译器像往常一样编译它没有任何错误,但在尝试运行它时,我收到断言错误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上运行。

感谢。

1 个答案:

答案 0 :(得分:2)

你没有足够的空间。您的所有malloc()来电都应使用sizeof(type)而不是sizeof(type *)

你期望整个struct all_vectors有足够的空间,但只能为单个指针创建足够的空间。然后你写它就好像有足够的空间,但它最终写入你的malloced内存的末尾。

您的所有struct vector malloc都存在同样的问题,但是,在此示例中您没有写入它们,因此没有任何问题症状。