sd

本文介绍了一个使用多线程连接MySQL数据库的C++示例程序。该程序通过创建多个线程并让每个线程独立地与MySQL数据库进行交互,展示了如何查询数据库中的表信息。适用于希望了解多线程环境下数据库操作的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
        muti_thread_mysql_client.cpp
    */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <mysql/mysql.h>
    #include <pthread.h>
    #include <unistd.h>

    #define THREAD_NUM  4
    #define DBHOST      "localhost"
    #define DBUSER      "pca"
    #define DBPASS      "pca"
    #define DBPORT      3306
    #define DBNAME      "dxponline"
    #define DBSOCK      NULL //"/var/lib/mysql/mysql.sock"
    #define DBPCNT      0

    typedef struct ThreadArgsST
    {
        int id;
        pthread_t *thread_id;
    } ThreadArgs;

    void *func(void *arg)
    {
        ThreadArgs *args = (ThreadArgs *)arg;
        MYSQL_RES *result;
        MYSQL_ROW row;
        MYSQL_FIELD *field;
        unsigned int num_fields;
        unsigned int i;
        unsigned int timeout = 3000;
        const char *pStatement = "SHOW TABLES";
        mysql_thread_init();
        MYSQL *mysql = mysql_init(NULL);

        if (mysql == NULL)
        {
            printf("[%ld][%d]mysql init failed: %s\n", *args->thread_id, args->id, mysql_error(mysql));
            return (void *)0;
        }

        mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);

        if (mysql_real_connect(mysql, DBHOST, DBUSER, DBPASS, DBNAME, DBPORT, DBSOCK, DBPCNT) == NULL)
        {
            printf("[%ld][%d]connect failed: %s\n", *args->thread_id, args->id, mysql_error(mysql));
            mysql_close(mysql);
            mysql_thread_end();
            return (void *)0;
        }

        printf("[%ld][%d]connect succssfully\n", *args->thread_id, args->id);

        if (0 != mysql_real_query(mysql, pStatement, strlen(pStatement)))
        {
            printf("[%ld][%d]query failed: %s\n", *args->thread_id, args->id, mysql_error(mysql));
            mysql_close(mysql);
            mysql_thread_end();
            return (void *)0;
        }

        result = mysql_store_result(mysql);

        if (result == NULL)
        {
            printf("[%ld][%d]fetch result failed: %s\n", *args->thread_id, args->id, mysql_error(mysql));
            mysql_close(mysql);
            mysql_thread_end();
            return (void *)0;
        }

        num_fields = mysql_num_fields(result);
        printf("[%ld][%d]numbers of result: %d\n", *args->thread_id, args->id, num_fields);

        while (NULL != (field = mysql_fetch_field(result)))
        {
            printf("[%ld][%d]field name: %s\n", *args->thread_id, args->id, field->name);
        }

        while (NULL != (row = mysql_fetch_row(result)))
        {
            unsigned long *lengths;
            lengths = mysql_fetch_lengths(result);

            for (i = 0; i < num_fields; i++)
            {
                printf("[%ld][%d]{%.*s} ", *args->thread_id, args->id, (int) lengths[i], row[i] ? row[i] : "NULL");
            }

            printf("\n");
        }

        mysql_free_result(result);
        mysql_close(mysql);
        mysql_thread_end();
        return (void *)0;
    }

    int main(int argc, char *argv[])
    {
        int thread_num;

        if (argc == 2)
        {
            thread_num = atoi(argv[1]);
        }
        else
        {
            thread_num = THREAD_NUM;
        }

        mysql_library_init(0, NULL, NULL);
        printf("argc: %d and thread_num: %d\n", argc, thread_num);

        do
        {
            pthread_t *pTh = new pthread_t[thread_num];
            ThreadArgs *pArgs = new ThreadArgs[thread_num];
            int i;

            for (i = 0; i < thread_num; i ++)
            {
                pArgs[i].id = i;
                pArgs[i].thread_id = &pTh[i];

                if (0 != pthread_create(&pTh[i], NULL, func, &pArgs[i]))
                {
                    printf("pthread_create failed\n");
                    continue;
                }
            }

            for (i = 0; i < thread_num; i ++)
            {
                pthread_join(pTh[i], NULL);
            }

            delete[] pTh;
            delete[] pArgs;
        }
        while (0);

        mysql_library_end();
        return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值