mysql_real_connect 线程安全问题

来源:互联网 发布:php博客系统源码 编辑:程序博客网 时间:2024/06/14 13:25

1. mysql_init()函数在第一次初始化的时候,不是线程安全的,但是之后是线程安全的

所以,如果需要用mysql c api实现线程安全的并发短连接的话,可以如下实现:

void *run(void * data){    long success_count = 0;    long fail_count = 0;    struct Param *pa = (struct Param*) data;    const char * hostname = pa->hostname;    const char * username = pa->username;    const char * password = pa->password;    unsigned int port = pa->port;                                                                                                                                           const char * dbname = pa->dbname;        //第一次mysql_init()的时候,采用锁    pthread_mutex_lock(&work_mutex);    MYSQL * conn = mysql_init(NULL);    pthread_mutex_unlock(&work_mutex);    while(!flag){        if(init_connect(conn,hostname,username,password,dbname,port) == 0){             fail_count ++;             fprintf(stderr, "Failed to connect to database: Error: %s\n",mysql_error(conn));        }else{            success_count ++;             mysql_close(conn);            conn = mysql_init(NULL);//之后就不需要了        }     }       pthread_mutex_lock(&work_mutex);    total_success_count = total_success_count + success_count;    total_fail_count = total_fail_count + fail_count;    end_thread ++;     pthread_mutex_unlock(&work_mutex);}


编译的时候,带上-lmysqlclient_r 参数