...
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()
звонок, который может занять много времени.
Других решений пока нет …