2015-12-30 113 views
1

我正在開發一個線程化程序,它讀取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]); 
    } 
+0

問:什麼是運行多個線程的目的?問:無關,但爲什麼您使用棄用的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

+0

@ paulsm4這是一個應用程序,需要更高的速度。在這個程序中還有另一個沒有被開發的進程。計算並插入到另一臺mysql服務器。這只是開始部分。 – Laksith

+3

非常重要: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

回答

1

我不得不走到一個非常艱難的境地才能最終達到目的。它非常簡單,只有一個數組聲明才能做到這一點。在我的代碼中,在主函數中。創建我使用的線程,當

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]); 
} 

這裏是anthor鏈接,說這個 Pthreads

薄是,當陣列做他們的工作,他們使用過整數i以來的地址該整數被傳遞並且在for循環中不斷增加其值。所以當線程嘗試使用它時,它已經增加並且不斷增加。所以它會卡住。

因此,要克服它我所做的是我decleared數組作爲

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]); 
} 

此所做的工作以及在創建線程時

for (i = 0; i < threadCount; i++) { 
    tbl[i] = i; 
} 
i == 0; 

這個陣列elemets獲得通過。還有一些更少的修改。我沒有在這裏提到,因爲我認爲它們與我的問題無關。他們在主線末端加入線程時,我使用了pthread_attr使它們可以加入其他方式,但它並不完全正確。所以這裏是最後的唯一的代碼(在這裏給出的主要功能,因爲變化僅適用於主發生)的

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作爲參考。

+0

沒有。正如我所提到的那樣,連接沒有問題,因爲它對1個線程正常工作。並在服務器上正常工作 – Laksith

+0

請打印所有字符串參數(dataBase)和整數參數的值。這可能會給出正確的圖片。 – doptimusprime

相關問題