本节为编写使用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_real_query ()
(或mysql_query ()
),mysql_store_result ()
在一个线程中,没有其他线程使用相同的连接。要做到这一点,使用互斥锁mysql_real_query ()
(或mysql_query ()
),mysql_store_result ()
调用。后mysql_store_result ()
返回时,锁可以释放,其他线程可以查询相同的连接。如果使用POSIX线程,则可以使用
pthread_mutex_lock ()
而且pthread_mutex_unlock ()
建立和释放互斥锁。多个线程可以访问检索的不同结果集
mysql_store_result ()
.使用
mysql_use_result ()
,您必须确保没有其他线程使用相同的连接,直到关闭结果集。但是,对于共享相同连接的线程客户端来说,使用它确实是最好的mysql_store_result ()
.
如果一个线程没有创建到MySQL数据库的连接,但是调用了MySQL函数,需要考虑以下几点:
当你打电话时mysql_init ()
, MySQL为调试库使用的线程创建一个特定于线程的变量。如果你在线程调用之前调用MySQL函数mysql_init ()
,该线程没有必要的线程特定变量,您可能迟早会得到一个核心转储。为避免出现问题,您必须做到以下几点:
调用
mysql_library_init ()
在任何MySQL函数之前。它不是线程安全的,所以在创建线程之前调用它,或者使用互斥锁保护调用。安排
mysql_thread_init ()
在调用任何MySQL函数之前在线程处理程序中调用。(如果你打电话mysql_init ()
,它叫mysql_thread_init ()
给你。)在线程中调用
mysql_thread_end ()
在调用之前pthread_exit ()
.这将释放MySQL线程特定变量使用的内存。
上述关于mysql_init ()
也适用于mysql_connect ()
,它叫mysql_init ()
.