У меня есть DLL, которая не является потокобезопасной и должна использоваться несколькими потоками. Я не уверен, как Windows обнаруживает загруженные DLL-файлы, будь то полный путь к файлу или имя DLL/модуля. Если используется путь к файлу, я думаю, что может быть возможно скопировать DLL в отдельные файлы для каждого потока, например. MyLib1.dll
, MyLib2.dll
, MyLib3.dll
и загрузить их LoadLibrary
.Несколько LoadLibrary для копий одной DLL
ответ
До тех пор, пока вы используете полное абсолютное имя файла при вызове LoadLibrary
, и пока эти абсолютные имена файлов различны, вы можете загрузить несколько экземпляров.
Лично, если бы это был я, я бы создал поток, а затем скопировал DLL во временную папку, назвав ее <threadID>.dll
. Это гарантирует уникальность имени.
А как насчет случая, когда есть две загруженные библиотеки DLL, которые имеют разные пути к файлу, но одно и то же имя DLL в таблице экспорта? Какой из них загрузчик должен использовать для разрешения импорта для другого модуля, который будет загружен позже? – Sergio
Создает ли этот подход уникальную память для каждой DLL? –
@simon этот вопрос неточен. Что вы подразумеваете под уникальной памятью –
Почему вы не синхронизируете вызовы DLL с семафорами мьютексов? – sb9
@ sb9 DLL может содержать внутреннее состояние, поэтому мьютексы могут быть недостаточными. – Sergio
Кроме того, мьютексы уничтожат любую перспективу масштабируемости. –