Несколько экземпляров библиотеки dll в c

#c #multithreading #tcp #dllimport

#c #многопоточность #tcp #dllimport

Вопрос:

У меня 10 000 устройств, и я хочу управлять ими с помощью одного приложения на c . Устройства являются серверными, и я могу управлять ими только с помощью dll. Библиотека Dll написана для MFC, и она была написана не мной, поэтому я ничего не могу с ней поделать.

Библиотека Dll устанавливает связь TCP / IP между устройствами и моим приложением.Каждое устройство имеет разные переменные. Мне нужно открывать новый поток для каждого входящего соединения и загружать экземпляр моей библиотеки dll. Я не смог загрузить разные экземпляры библиотеки dll для каждого потока. каждый раз используется одна и та же библиотека dll и одни и те же данные.

Как можно загрузить несколько экземпляров библиотеки dll? Есть ли какой-либо способ сделать это с c . Заранее спасибо

Комментарии:

1. У вас есть 10 000 устройств, и позвольте мне прояснить, вам нужен новый поток для каждого входящего соединения, я полагаю, вы понимаете, что нет способа установить входящее соединение со всеми 10 000 устройствами, верно?

2. @Gizde — Вам нужно опубликовать код.

Ответ №1:

Если данные являются статическими, невозможно иметь больше экземпляров в том же процессе. Вы должны модифицировать библиотеку dll, чтобы иметь какие-то данные для каждого контекста (обычно для этого подходит экземпляр класса). В любом случае, в качестве общего предложения, никогда не запускайте до 10000 потоков в процессе, это снизит производительность. Напишите пул потоков и позвольте управлять клиентом, обслуживаемым этим пулом.

Ответ №2:

Ваша ситуация не кажется обнадеживающей.

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

Вы могли бы использовать LoadLibrary () и UnloadLibrary() для многократного «перезапуска» библиотеки DLL и таким образом лихорадочно переключаться между разными серверами. Что-то вроде LoadLibrary() … путаница с сервером… Выгрузите библиотеку () … сделайте это снова и в той же ситуации. Это было бы болезненно и медленно, но могло бы сработать для вас.

Ответ №3:

Единственный (некрасивый) способ загружать библиотеку dll несколько раз — это при каждой новой загрузке создавать копию исходной библиотеки dll с уникальным именем в месте, которое вы контролируете.

Загрузите копию с помощью LoadLibrary и настройте соответствующие указатели функций ( GetProcAddress(...) ) на функции во вновь загруженной библиотеке dll для использования в вашей программе.

После того, как вы закончите с этим, выгрузите копию с помощью FreeLibrary и удалите копию с диска.

Ответ №4:

Я не вижу простого решения этой проблемы, как уже говорилось ранее, вы не можете создать несколько экземпляров библиотеки DLL в приложении.

Может быть ужасное решение, которое заключается в написании облегченного прокси для прослушивания входящих запросов и порождения нового экземпляра реального приложения при каждом запросе и пересылки трафика на него — должен быть способ загружать новую копию библиотеки DLL в каждом экземпляре (технически вы будете повторно открывать ту же загруженную библиотеку DLL, но в ней должны быть отдельные пространства данных).

Однако с устройствами 10k производительность будет ужасной. Похоже, что лучшим решением является либо повторная реализация протокола (либо использование опубликованной спецификации, либо обратное проектирование).