2016-08-03 9 views
0

У меня есть DLL, которая не является потокобезопасной и должна использоваться несколькими потоками. Я не уверен, как Windows обнаруживает загруженные DLL-файлы, будь то полный путь к файлу или имя DLL/модуля. Если используется путь к файлу, я думаю, что может быть возможно скопировать DLL в отдельные файлы для каждого потока, например. MyLib1.dll, MyLib2.dll, MyLib3.dll и загрузить их LoadLibrary.Несколько LoadLibrary для копий одной DLL

+0

Почему вы не синхронизируете вызовы DLL с семафорами мьютексов? – sb9

+0

@ sb9 DLL может содержать внутреннее состояние, поэтому мьютексы могут быть недостаточными. – Sergio

+0

Кроме того, мьютексы уничтожат любую перспективу масштабируемости. –

ответ

2

До тех пор, пока вы используете полное абсолютное имя файла при вызове LoadLibrary, и пока эти абсолютные имена файлов различны, вы можете загрузить несколько экземпляров.

Лично, если бы это был я, я бы создал поток, а затем скопировал DLL во временную папку, назвав ее <threadID>.dll. Это гарантирует уникальность имени.

+0

А как насчет случая, когда есть две загруженные библиотеки DLL, которые имеют разные пути к файлу, но одно и то же имя DLL в таблице экспорта? Какой из них загрузчик должен использовать для разрешения импорта для другого модуля, который будет загружен позже? – Sergio

+0

Создает ли этот подход уникальную память для каждой DLL? –

+0

@simon этот вопрос неточен. Что вы подразумеваете под уникальной памятью –