我正在開發一個線程化程序,它讀取10個線程中的mysql數據庫,並將結果作爲每個線程的行數打印出來。所以最終的結果是在命令行上有100行計數。問題是當我運行它時,它有時會給出一個錯誤,說Can't connect to MySQL server on 'localhost' (111)
有時它會返回一個segmentation fault(core dumped)
我檢查了線程,它們也創建正常,沒有錯誤。無法連接到'localhost'上的MySQL服務器(111)
當我創建只有一個線程它完美地罰款給予預期的輸出。 No of Rows of 00 - 6
另一件事是我在紅帽服務器運行這個和它運作良好,沒有錯誤,但數爲wrong.I創建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]);
}
問:什麼是運行多個線程的目的?問:無關,但爲什麼您使用棄用的API,而不是[PDO](http://php.net/manual/en/ref.pdo-mysql.php)或[mySqli](http:// php。淨/手動/ EN/book.mysqli.php)?看看這裏的更多細節:http://php.net/manual/en/mysqlinfo.api.choosing.php – paulsm4
@ paulsm4這是一個應用程序,需要更高的速度。在這個程序中還有另一個沒有被開發的進程。計算並插入到另一臺mysql服務器。這只是開始部分。 – Laksith
非常重要:1)請不要*針對棄用的「mysql」API編寫任何新代碼。 2)請不要*期待你的線程中的「printf()'」匹配執行的實際順序 - 它們不會。 4)檢查mySQL配置中的[max_connections](https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html)。最重要*:請看看你的'mysql_error()'輸出,看看你的mySQL錯誤日誌,並且*用一個不錯的錯誤消息*更新你的POST。 – paulsm4