linux下多线程连接mysql(C语言)

来源:互联网 发布:淘宝商品详情模板设计 编辑:程序博客网 时间:2024/06/05 06:21

采用pthread库,在linux环境下使用gcc编译并运行的Mysql多线程模型。编译时gcc增加编译选项:                  -lpthread -lmysqlclient_r.so, 后者是mysql 的线程安全链接库(referlinux 下mysql多线程支持问题),数据库访问部分如下。 (每个线程维护一个单独的MYSQL结构,并初始化线程专用数据,由于mysql_real_connect会自动调用mysql_thread_init(), 函数里面不再重复调用。)

int main(){    mysql_library_init(0,NULL,NULL);    pthread_t producer;    pthread_t consumer_1;    pthread_t consumer_2;//produce_fun不涉及数据库链接,不贴出来    pthread_create(&producer,NULL,produce_fun,NULL);    pthread_create(&consumer_1,NULL,consume_fun,NULL);    pthread_create(&consumer_2,NULL,consume_fun,NULL);//下面的三句非常重要,main线程等待其他三个线程的结束,避免main线程执行到mysql_library_end时退出,而//其他三个线程仍然在运行并报错的情形    pthread_join(producer,NULL);    pthread_join(consumer_1,NULL);    pthread_join(consumer_2,NULL);    mysql_library_end();    return 0;}void addRecord_d(MYSQL *ptr_db,const char *t_name,int item){    char query_buffer[100];    sprintf(query_buffer,"insert into %s values(0,%d)",t_name,item);    int ret=mysql_query(ptr_db,query_buffer);    if(ret){        fprintf(stderr,"%s%s\n","cannot add record to ",t_name);        return;    }    unsigned long long update_id=mysql_insert_id(ptr_db);    printf("add record (%llu,%d) ok.",update_id,item);}void * consume_fun(void *arg){    MYSQL db;    MYSQL *ptr_db=mysql_init(&db);    mysql_real_connect();   //蓝色部分可以改为其他任何带操作数据库语句的代码    //procedure    while(1){        printf("consumer...");        int item=consume(&p);        addRecord_d(ptr_db,"test",item);    }   mysql_thread_end();    pthread_exit(NULL);}


原创粉丝点击