2012-05-17 2 views
1

У меня есть цикл for в C++, параллельный с использованием OpenMP. В цикле я получаю доступ к базе данных sql-сервера. Мне сказали, что если я использую один и тот же драйвер ODBC между потоками, доступ к данным не будет параллельным. Если я определяю разные драйверы для каждой итерации, это потребует много времени. (?) Есть ли способ иметь разные потоки для доступа к одинаковым данным в безопасном параллельном режиме?thread safe sql server from C++

PS: Я не пишу в базу данных, просто читая ее.

+0

Я не уверен, но вы можете ссылаться на приведенную ниже ссылку, возможно, вы можете получить представление о доступе к тем же данным двумя или несколькими потоками параллельно: - http://stackoverflow.com/questions/5365941/is-boostinterprocessshared -ptr-threadsafe-and-interprocess-safe – Abhineet

ответ

0

Мне сказали, что если я использую один и тот же драйвер ODBC между потоками, доступ к данным не будет параллельным.

Вы уверены, что именно это указали?

Существует много проблем многопоточности, но для большинства драйверов ODBC вы можете использовать модель подключения за потоки для параллельного чтения. Поэтому подключайте каждый раз, когда вы начинаете поток (и закрываете, когда поток закрыт). Лучшим шаблоном будет использование пула соединений.

+0

Да. Чтобы дать больший контекст этой проблеме, у меня есть кросс-100k-матрица цифр в базе данных, и каждый поток принимает линейную комбинацию этих столбцов, а затем сортирует ее. Поскольку разные потоки не связаны друг с другом, они могут быть параллельными. Я думаю, что сортировка в sql будет быстрее, чем в C++. (?) – isometry

+0

Это зависит от драйвера ODBC, но большинство из них поддерживают параллельную обработку. MSSQL, Postgress, Oracle ... предоставляет, что операции readonly будут выполняться параллельно очень хорошо. Для этого используйте модель «нить за соединение». – Dewfy