c - 另一个malloc.c :3096: sYSMALLOc issue with pthreads and mqueue

标签 c multithreading pthreads malloc assertion

我读了很多ma​​lloc.c:3096: sYSMALLOC:主题,但我找不到任何解决我的问题的方法。我问你,我的头脑已经放弃了这种可能的工作。这是:

我有 sensors.h sensors.cmain.c 文件。我想使用消息队列在不同文件(sensors.c 和 main.c)中的两个函数(线程)之间交换消息。 gcc 编译器像往常一样编译它,没有任何错误,但在尝试运行它时,我收到断言错误 malloc.c:3096: sSYSMALLOc: 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 *) vector ); 当然,我使用的是pthread_mq_函数的返回值,为了尽量减少代码,我在这里没有提及。我正在使用 Raspberry Pi,我认为好的程序 valgrind 不能在 Raspberry Pi 上运行。

谢谢。

最佳答案

您没有分配足够的空间。你所有的malloc()调用应使用 sizeof(type)不是sizeof(type *) .

您期望有足够的空间容纳整个 struct all_vectors但只为单个指针创建足够的空间。然后,您可以像有足够的空间一样对其进行写入,但最终写入的内容超出了分配的内存末尾。

您所有的 struct vector 都存在同样的问题但是,在本示例中您不会写入 malloc,因此不会出现任何问题症状。

关于c - 另一个malloc.c :3096: sYSMALLOc issue with pthreads and mqueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21198569/

相关文章:

c - select 未指示 pthread_create 启动的函数中数据到达

C - 在 Windows 上编写在 UNIX 上编译,反之亦然

c++ - 指向 void * 函数的指针 C++

c - setitimer 的 ITIMER_PROF(SIGPROF) 是否发送到多线程和 NPTL 以及 Linux(2.6.21.7) 中的每个线程?

java - 为什么我的线程使我的 JavaFX 应用程序滞后?

java - 多线程对象数组列表

multithreading - WinForms 线程安全控件

C while循环直到用户输入 "quit"

c++ - 特殊的简单随机数发生器

c++ - C++中的按位设置