3.4编写C API线程客户端程序

本节提供了编写在MySQL C API中使用与线程相关功能的客户端程序的指导。有关这些功能的更多信息,请参阅第7.2节,“C API线程函数的描述”.有关使用它们的源代码的示例,请查看客户MySQL源分发的目录:

  • 来源mysqlimport.在与之关联的代码中使用线程- 使用线程选择。

  • 来源mysqlslap.使用线程设置并发工作负载,以测试高负载下的服务器操作。

如果在将线程程序链接到MySQL客户端库时会发生未定义的参考错误,则最可能的原因是您不包含链接/编译命令上的线程库。

客户端库几乎是线程安全的。最大的问题是子例程sql / net_serv.cc.从套接字读取的读取不是中断的安全性。这是通过思想来完成的,您可能希望拥有自己的警报,可以打破到服务器长期读取。如果安装中断处理程序sigpipe.中断,插座处理应该是线程安全的。

要避免在连接终止时中止程序,MySQL块sigpipe.在第一次打电话mysql_library_init ()mysql_init(), 或者mysql_connect().用你自己的sigpipe.处理程序,第一次打电话mysql_library_init (),然后安装处理程序。

每个连接的客户端库是线程安全的。两个线程可以与以下警告共享相同的连接:

  • 多个线程无法在同一连接上同时向MySQL Server发送查询。特别是,您必须确保呼叫之间mysql_real_query()(或者mysql_query()) 和mysql_store_result()在一个线程中,没有其他线程使用相同的连接。要做到这一点,请在您的pair周围使用一个互斥锁mysql_real_query()(或者mysql_query()) 和mysql_store_result()呼叫。后mysql_store_result()返回,可以释放锁定,其他线程可能会查询相同的连接。

    如果使用POSIX线程,则可以使用pthread_mutex_lock()pthread_mutex_unlock()建立并释放互斥锁锁。

    笔记

    如果您在MySQL源分发中检查程序,而不是调用pthread_mutex_lock()pthread_mutex_unlock(),你会看到电话native_mutex_lock ()native_mutex_unlock().后一种函数在thr_mutex.h.标题文件和映射到特定于平台的互斥函数。

  • 多个线程可以访问检索的不同结果集mysql_store_result()

  • 使用mysql_use_result(),您必须确保在关闭结果集之前,没有其他线程使用相同的连接。但是,它真的最好对共​​享与使用相同连接的线程客户端mysql_store_result()

如果线程未创建与MySQL数据库的连接,但调用MySQL函数,请执行以下内容:

你打电话的时候mysql_init(), MySQL为调试库使用的线程创建一个特定于线程的变量。如果你在线程调用之前调用MySQL函数mysql_init(),线程没有必要的特定于线程的变量,您可能最终最终倾倒核心转储。为避免出现问题,必须执行以下操作:

  1. 称呼mysql_library_init ()在任何其他MySQL函数之前。它不是线程安全的,所以在创建线程之前调用它,或用互斥锁保护呼叫。

  2. 为..作安排mysql_thread_init()在调用任何MySQL函数之前,在Thread Handler中早期调用。(如果你打电话mysql_init(),它呼叫mysql_thread_init()给你。)

  3. 在线程,呼叫mysql_thread_end()在打电话之前pthread_exit().这使MySQL线程特定变量使用的内存释放。

上述关于mysql_init()也适用于mysql_connect(),呼叫mysql_init()