windows - Sådan bruges et gammelt single-threaded C ++-bibliotek i et multithreaded miljø

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et gammelt C + + bibliotek, der er designet til brug i single-threaded miljøer.


Biblioteket udsætter grænsefladerne til initialisering, som ændrer bibliotekets interne datastrukturer og brug, som kun læser data og foretager beregninger.


Mit mål er at bruge dette bibliotek i en Windows multithreaded applikation med forskellige tråde, der kalder forekomster af dll initialiseret med forskellige data.


Forudsat at omskrivning af dll'en for at tillade multithreadning ville være uoverstigelig, er der en måde at lade flere forekomster af en DLL eksistere i samme proces med separate hukommelsesrum eller for at opnå et lignende resultat på andre måder?

Bedste reference


Hvis DLL'en indeholder statiske ressourcer, vil de blive delt blandt alle oprettede forekomster.


En mulig måde ville være at skabe en enkelt instans og begrænse adgangen til den ved hjælp af en slags låsemekanisme. Dette kan reducere ydeevnen afhængigt af brugen, men uden at ændre den interne struktur af DLL kan det være svært at arbejde med flere forekomster.

Andre referencer 1


Deling af statiske ressourcer mellem alle tråde, der er knyttet til en enkelt DLL inden for en proces, sammensætter dig her.


Der er dog et trick for at opnå dette. Så længe DLL'er har forskellige navne, så betragter systemet dem som værende forskellige, så der oprettes separate forekomster af kode og data.


Vejen for at opnå dette er, for hver tråd, at kopiere DLL'en til en midlertidig fil og indlæse derfra med LoadLibrary. Du skal bruge eksplicit linking (GetProcAddress) i stedet for lib-filer, men det er virkelig den eneste vej.