我正在开发一个线程程序,它在10个线程中读取一个mysql数据库,并将结果打印为每个线程的行数。因此,最终结果是命令行上的100行计数。问题是当我运行它时有时会出错Can't connect to MySQL server on 'localhost' (111)
有时它返回segmentation fault(core dumped)
我检查了线程,它们也被正确创建,没有错误。
当我只创建一个线程时,它可以很好地完成预期输出。
No of Rows of 00 - 6
另一件事是我在一个红帽服务器上运行它并且它运行良好没有错误但是计数错误。我创建了5个线程,并且对于第一个线程52380
是正确的但是对于其他线程它给出了不同的结果结果应该是这样的
No of Rows of 00 - 52380
No of Rows of 01 - 53434
No of Rows of 02 - 53333
No of Rows of 03 - 50005
No of Rows of 04 - 48393
但实际结果是这个
No of Rows of 00 - 52380
No of Rows of 00 - 52380
No of Rows of 01 - 52380
No of Rows of 01 - 52380
No of Rows of 01 - 52380
我使用
编译它gcc main.c -lpthread `mysql_config --cflags --libs`
造成这个问题的原因是什么。任何人都可以帮我这个。这里是我使用的代码。这里没有给出头文件。它包含数据库详细信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main1.h"
#include <pthread.h>
#include <mysql/mysql.h>
#include <mysql/my_global.h>
int main(int argc, char** argv) {
int threadRet[10], i = 0;
pthread_t * threadT = (pthread_t *) malloc(10 * sizeof (pthread_t));
for (i = 0; i < 10; i++) {
threadRet[i] = pthread_create(&threadT[i], NULL, threadedConnection, &i);
printf("thread %d - thread ret %d\n",i,threadRet[i]);
}
i = 0;
for (i = 0; i < 10; i++) {
pthread_join(threadT[i], NULL);
}
return (EXIT_SUCCESS);
}
void * threadedConnection(void * parr) {
int * j = (int *) parr;
int tableNo=*j;
long int rowCount = 0;
long int totalInserts = 0;
MYSQL *con1 = mysql_init(NULL);
MYSQL_RES *result;
MYSQL_ROW row;
con1[tableNo] = mysql_init(NULL);
if (mysql_real_connect(con1, dataBase1[0], dataBase1[1], dataBase1[2], dataBase1[3], 0, NULL, 0) == NULL) {
fprintf(stderr, "%s\n", mysql_error(con1));
mysql_close(con1);
exit(1);
}
char countQuery[70];
sprintf(countQuery, "SELECT COUNT(*) FROM numberTable where number like '%s%.2d'", "%", *tableNo);
if (mysql_query(con1[tableNo], countQuery)) {
fprintf(stderr, "%s\n", mysql_error(con1));
mysql_close(con1);
exit(1);
}
result = mysql_store_result(con1); //Counting
row = mysql_fetch_row(result[tableNo]); //line
rowCount = strtol((row)[0], NULL, 10); //numbers
totalInserts = rowCount; //numberTable
mysql_free_result(result[tableNo]);
printf("No of Rows of %.2d - %ld\n", tableNo, totalInserts);
mysql_close(con1[tableNo]);
}
答案 0 :(得分:1)
我不得不采取一个非常艰难的局面来最终达到目的。它非常简单,只有一个数组声明才能完成。在我的代码中,在main函数中。在创建我已经使用的线程时,
for (i = 0; i < 10; i++) {
threadRet[i] = pthread_create(&threadT[i], NULL, threadedConnection, &i);
printf("thread %d - thread ret %d\n",i,threadRet[i]);
}
以下是关于此的谚语链接 Pthreads
瘦是指当数组完成它们的工作时,它们使用传递的整数i
,因为整数的地址被传递,并且在for循环中它不断增加它的值。因此,当线程尝试使用它时,它已经增加并不断增加。所以它被卡住了。
所以为了克服它,我所做的就是删除了一个数组
for (i = 0; i < threadCount; i++) {
tbl[i] = i;
}
i == 0;
并且在创建线程时传递了此数组元素
for (i = 0; i < 10; i++) {
threadRet[i] = pthread_create(&threadT[i], NULL, threadedConnection, &tbl[i]);
printf("thread %d - thread ret %d\n",i,threadRet[i]);
}
这做得很好。并且还有一些修改。我在这里没有提到,因为我认为他们与我的问题无关。他们在主要结束时加入线程时,我使用了pthread_attr
使它们可以加入其他方面它不是很正确。所以这里只有最终的代码(这里给出了main函数,因为更改只发生在main中)
int main(int argc, char** argv) {
int threadRet, i = 0;
int tbl[threadCount];
void *status;
pthread_attr_t attr;
for (i = 0; i < threadCount; i++) {
tbl[i] = i;
}
i == 0;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_t * threadT = (pthread_t *) malloc(threadCount * sizeof (pthread_t));
for (i = 0; i < threadCount; i++) {
threadRet = pthread_create(&threadT[i], &attr, threadedConnection, &tbl[i]);
if (threadRet) {
printf("Error creating thread return value of pthread_create() is %d", threadRet);
}
printf("thread %d - thread ret %d\n", i, threadRet);
}
i = 0;
pthread_attr_destroy(&attr);
for (i = 0; i < threadCount; i++) {
threadRet = pthread_join(threadT[i], &status);
if (threadRet) {
printf("Error joining thread return value of pthread_join() is %d", threadRet);
}
}
free(threadT);
pthread_exit(NULL);
return (EXIT_SUCCESS);
}
感谢任何试图帮助他们贡献时间的人....
答案 1 :(得分:0)
在
if (mysql_real_connect(con1, dataBase1[0], dataBase1[1], dataBase1[2], dataBase1[3], 0, NULL, 0) == NULL) {
^ port
您需要将默认端口传递给3306.检查主机名和其他参数。
请参阅http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html以供参考。