读书人

求指点:关于LINUX C MYSQL多线程编程

发布时间: 2012-09-06 10:37:01 作者: rapoo

求指点:关于LINUX C MYSQL多线程编程问题
本人遇到一个蛋疼的问题,要开启10000个线程来向数据库插入数据。以下是代码:

C/C++ code
#include <stdio.h>#include <pthread.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <syslog.h>#include <unistd.h>#include <time.h>#include <math.h>#include "/usr/local/mysql/include/mysql.h"#define NTHREADS 300#define PREMAX   300pthread_mutex_t mutex1 =  PTHREAD_MUTEX_INITIALIZER;int counter = 0;void *thread_fun(void *);const char *db_host = "localhost"; const char *db_user = "root";const char *db_pass = "linkpower";const char *db_name = "lprcms_wn";void log_error(char *msg){    FILE *fd;    fd = fopen("file.txt", "a+");    if (fd){        fputs(msg, fd);        fclose(fd);    }}void main(){    pthread_t thread_id[NTHREADS];    int i;    int j;    int k;    int times;    int start = time(NULL);    mysql_library_init(0,NULL,NULL);        times = ceil(NTHREADS / PREMAX);    for(i = 0; i < times; i++){        for( k = PREMAX * i; k <  PREMAX * (i + 1); k++){            pthread_create(&thread_id[k], NULL, thread_fun, &k);        }        for(k = PREMAX * i; k <  PREMAX * (i + 1); k++){            pthread_join(thread_id[k], NULL);        }        usleep(400000);        int middle = time(NULL);        int mid_diff = middle - start;        printf("Middle Diff:%d\n", mid_diff);    }    mysql_library_end();    int end = time(NULL);    int diff = end - start;    printf("Diff:%d\n", diff);}void *thread_fun(void *ptr){    int *tag;    tag = (int *)ptr;    //printf("Thread NO%d. %ld \n", *tag, pthread_self());    int c = 0;    int flag = 0;            MYSQL *conn;    MYSQL_RES *res;    MYSQL_ROW row;        pthread_mutex_lock(&mutex1);    if(conn = mysql_init(NULL)){        if(NULL != mysql_real_connect(conn, db_host, db_user, db_pass, db_name, 0, NULL, 0)){            if(0 == mysql_query(conn, "INSERT INTO demo1(indexVal) VALUES ('1')")){                res = mysql_store_result(conn);                mysql_free_result(res);            } else {                log_error((char *)tag);                //usleep(1000);            }        }        else{            char *msg1 = "Connect error! \n";            printf("Pthread NO. %d \n", counter);            //usleep(1000);            log_error(msg1);            msg1 = NULL;        }    }     else {        char *e_msg = "INITIAL ERROR! \n";        log_error(e_msg);        e_msg = NULL;    }    pthread_mutex_unlock(&mutex1);    mysql_close(conn);    mysql_thread_end();    pthread_exit( (void *)0 );}


虽然插入成功,但是耗时1000秒左右。感觉效率有点低,求高人指点。如何改进使得耗时减少?

[解决办法]
10000个线程?设计不合理,光线程切换就要耗多少时间啊
[解决办法]
配置mysql增加连接数>1000,去掉你的程序mutex,每个线程一个mysql连接,由mysql自身的线程池并发1000同时处理各个mysql请求,可以秒杀。

楼主可以自己心思一下,你的所谓的1000个线程根本不如一个线程快,足够愚蠢了。暴露出来的问题就是,你不知道mysql引擎分为myisam/innodb,不知道锁表和锁记录的区别,不知道mysql的架构实现,所以导致你也没意识到自己的程序是假并行。

读书人网 >C语言

热点推荐