繁体   English   中英

在多线程环境中使用Mysql ++的问题

[英]Issues using Mysql++ in a multithreaded environment

希望有人可以帮助我,因为我遇到了一些“奇怪的”细分错误。 我目前正在使用C ++守护程序,该守护程序会定期处理来自输入源的传入数据,然后将其发送回另一个系统。

该守护程序当前运行两个线程-一个线程(主线程)从消息队列中读取传入的数据,并将已处理的数据插入MySQL数据库,另一个线程从特定表中读取并将已处理的数据推送到另一个系统。

我假设该错误与MySQL和线程相关,因为在运行一个线程时,我没有任何问题(仅是数据处理,或者只是退回处理后的数据)。

SIGSEGV错误与所有mysql ++相关(连接到数据库后调用的第一个mysql ++方法),例如:

(gdb) backtrace
#0  clear (this=0xabd4e8) at /usr/include/c++/4.7/bits/basic_string.h:801
#1  ping (this=0xabcf40) at ./lib/dbdriver.h:465
#2  mysqlpp::Connection::ping (this=<optimized out>) at ./lib/connection.cpp:243

当两个线程都连接到MySQL数据库时,崩溃也总是从辅助线程触发的(当主线程运行人工while(true)循环时运行正常)

连接代码:

    mysqlConnection = new mysqlpp::Connection(false);
    mysqlConnection->set_option(new mysqlpp::ReconnectOption(true)); // Reconnect if session times out

    if(!mysqlConnection->connect("fakeDbName", "fakeHostName",
                                 "fakeUserName", "fakePassword))
    {
        printf("Failed to connect..\n");
    }

    if(!mysqlConnection->thread_aware())
    {
        printf("Mysql++ not compiled with threading support\n");
    }
    else
    {
        printf("Mysql++ compiled with threading support\n");
    }

我遵循了Mysql ++的指南,使用“ --enable-thread-check”进行配置/编译,并使用“ libmysqlclient_r”进行链接。 连接后,我正在获取“带有线程支持的Mysql ++编译” printf。 我还在为两个线程创建一个单独的连接对象。

有什么想法吗?

您可以在数据库访问周围放置一个信号灯,以排除mysql库中的某些线程安全问题。 但是我很好奇为什么在这里需要单独的线程...似乎发送线程的操作直接与接收线程绑定。 为什么你们不能在同一线程中做这两个事情?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM