我正在开发一个连接到mysql数据库的ac程序,从一个包含400万个数据的表中读取数据,并在一些计算后将其数据写入另一个数据库中的另外100个表中.为了提高效率,我尝试使用100个线程为100个表和1个线程写入数据,以从数据库中读取数据并将其写入缓冲区.这样100个线程就会从缓冲区读取.
但问题是我正在制作缓冲区.我曾经malloc制作缓冲区.char *** queue;在头文件中声明,以便它是全局的
int i = 0, j = 0;
queue = (char ***) malloc(100);
int threadRet;
for (i; i < 100; i++) {
queue[i] = (char **) malloc(2000);
for (j; j < 2000; j++) {
queue[i][j] = (char *) malloc(180);
}
}
Run Code Online (Sandbox Code Playgroud)
和我之前提到的我的缓冲区编写线程一样,用于解释函数 void * thrededChunkPicker(void * parr)
sprintf(queue[tableNo][marker[tableNo]], "INSERT INTO usage_summary%s(mobile,`0`,ddate) VALUES('%s',%d,'%s') ON DUPLICATE KEY UPDATE `0` = VALUES(`0`), ddate=VALUES(ddate)", row[0] + 7, row[0], sumOfUsage, row[2]);
(marker[tableNo])++;
Run Code Online (Sandbox Code Playgroud)
这就是我写入缓冲区的方式.正如我发现的那样,分段故障发生在这里.
我需要100个缓冲区,每个缓冲区包含2000个180字符串数组.这段代码编译成功.但是运行时它会产生分段错误.
据我所知,你所有的malloc()电话都有问题.
我们将字节大小传递给malloc().malloc()无论如何都不知道你要存储返回指针的对象的大小.因此,它无法自动计算所需内存的总大小.
我们需要计算所需的总大小并将该大小传递给malloc().
首先,请参阅此讨论,了解为什么不投出malloc()和家人的回报值C..
也就是说,假设queue被定义为char *** queue;,我们需要
queue = malloc(100 * sizeof*queue );queue[i] = malloc(2000 * sizeof(*queue[i]) );等等,如果需要的话.
最后,在使用相同的指针之前,始终malloc()通过NULL检查返回的指针来检查是否成功.