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

本节为编写使用MySQL C API中线程相关函数的客户端程序提供指导。有关这些函数的详细信息,请参见第7.2节,“C API线程函数描述”.有关使用它们的源代码示例,请参阅客户端MySQL源发行版的目录:

  • 的来源mysqlimport类关联的代码中使用线程——使用线程选择。

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

如果在链接一个线程程序到MySQL客户端库时发生了未定义引用错误,最可能的原因是您没有在link/compile命令中包含线程库。

客户端库几乎是线程安全的。最大的问题是子程序sql / net_serv.cc从套接字读取的数据不是中断安全的。这样做的想法是,您可能想要有自己的警报,可以中断对服务器的长读取。的中断处理程序SIGPIPE中断、套接字处理应该是线程安全的。

为了避免在连接终止时中止程序,MySQL阻塞SIGPIPE第一次打电话给mysql_library_init ()mysql_init (),或mysql_connect ().使用自己的SIGPIPE处理程序,第一次调用mysql_library_init (),然后安装处理程序。

客户端库对每个连接都是线程安全的。两个线程可以共享同一个连接,但注意以下事项:

如果一个线程没有创建到MySQL数据库的连接,但是调用了MySQL函数,需要考虑以下几点:

当你打电话时mysql_init (), MySQL为调试库使用的线程创建一个特定于线程的变量。如果你在线程调用之前调用MySQL函数mysql_init (),该线程没有必要的线程特定变量,您可能迟早会得到一个核心转储。为避免出现问题,您必须做到以下几点:

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

  2. 安排mysql_thread_init ()在调用任何MySQL函数之前在线程处理程序中调用。(如果你打电话mysql_init (),它叫mysql_thread_init ()给你。)

  3. 在线程中调用mysql_thread_end ()在调用之前pthread_exit ().这将释放MySQL线程特定变量使用的内存。

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