...
options["OPT_WRITE_TIMEOUT"] = timeout;
std::lock_guard<std::recursive_mutex> locker(mutex_);
auto driver = sql::mysql::get_driver_instance();
connection_.reset(driver->connect(options));
...
此代码在单个线程中执行。它就像一个连接线程。
我想要的就是在建立连接以启动新连接的过程中暂停此连接,例如,使用新的更改选项。一定不能有安全的方法,或者我注定要等到当前连接尝试超过超时?
所以,get_driver_instance()
的文档说你不能同时从多个线程调用它。我想这是因为第一次调用它会创建驱动程序,因此重新进入该方法可能会导致创建多个驱动程序实例。这一切都很好,因为您可以在程序的静态初始化期间,在任何生成的线程之外调用此方法,因此不需要使用互斥锁来保护它。因此,您获取驱动程序一次并将其存储以供程序的其余部分使用。
driver->connect()
的文档并没有说它不是可重入的,所以它可能是重入的。这意味着您可以生成一个线程来尝试连接,并生成其他线程,这些线程也尝试连接不同的参数。
所以,你不应该在任何地方都需要互斥。如果由于某种原因你真的不想获得驱动程序一次并存储它以供以后使用,那么你可以使用互斥锁防止重新输入对get_driver_instance()
的调用,但是你没有(也不应该)使用互斥锁防止重新进入driver->connect()
的调用。因此,您将能够从多个线程并行调用driver->connect()
。
顺便说一句,get_driver_instance()
应立即返回;这是driver->connect()
电话,可能需要很长时间。