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 参数