Как использовать старую однопоточную библиотеку C ++ в многопоточной среде - PullRequest
4 голосов
/ 17 февраля 2011

У меня есть старая библиотека C ++, которая была разработана для использования в однопоточных средах.

Библиотека предоставляет интерфейсы для инициализации, которые изменяют внутренние структуры данных библиотеки, и использования, которое только считывает данные и выполняет вычисления.

Моя цель - использовать эту библиотеку в многопоточном приложении Windows, в котором разные потоки вызывают экземпляры DLL, инициализированные разными данными.

Предполагая, что переписать dll для обеспечения многопоточности было бы непомерно, существует ли какой-либо способ позволить нескольким экземплярам DLL существовать в одном и том же процессе с отдельными пространствами памяти или получить аналогичный результат другими способами?

Ответы [ 2 ]

6 голосов
/ 17 февраля 2011

Если библиотека DLL содержит статические ресурсы, они будут общими для всех созданных экземпляров.

Один из возможных способов - создать отдельный экземпляр и ограничить доступ к нему с помощью какого-либо механизма блокировки. Это может снизить производительность в зависимости от использования, но без изменения внутренней структуры DLL может быть сложно работать с несколькими экземплярами.

5 голосов
/ 17 февраля 2011

Совместное использование статических ресурсов между всеми потоками, подключенными к одной DLL внутри процесса, сговорилось против вас.

Однако для этого есть хитрость.Поскольку библиотеки DLL имеют разные имена, система рассматривает их как разные и поэтому создаются отдельные экземпляры кода и данных.

Способ достижения этого заключается в том, чтобы для каждого потока скопировать библиотеку DLL во временную папку.файл и загрузите оттуда с LoadLibrary.Вы должны использовать явные ссылки (GetProcAddress), а не файлы lib, но это действительно единственный способ.

...