本节提供了编写在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()
,线程没有必要的特定于线程的变量,您可能最终最终倾倒核心转储。为避免出现问题,必须执行以下操作:
称呼
mysql_library_init ()
在任何其他MySQL函数之前。它不是线程安全的,所以在创建线程之前调用它,或用互斥锁保护呼叫。为..作安排
mysql_thread_init()
在调用任何MySQL函数之前,在Thread Handler中早期调用。(如果你打电话mysql_init()
,它呼叫mysql_thread_init()
给你。)在线程,呼叫
mysql_thread_end()
在打电话之前pthread_exit()
.这使MySQL线程特定变量使用的内存释放。
上述关于mysql_init()
也适用于mysql_connect()
,呼叫mysql_init()
.