2016-08-03 2 views
0

J'ai une DLL qui n'est pas thread-safe et doit être utilisé par plusieurs threads. Je ne suis pas sûr de la façon dont Windows détecte les DLLs chargées, que ce soit par chemin de fichier complet ou par nom de DLL/module. Si le chemin du fichier est utilisé, je pense qu'il peut être possible de copier la DLL dans des fichiers séparés pour chaque thread, par ex. MyLib1.dll, MyLib2.dll, MyLib3.dll et les charger avec LoadLibrary.LoadLibrary multiples pour des copies de la même DLL

+0

Pourquoi ne vous synchronisez pas la DLL appelle avec sémaphores mutex? – sb9

+0

@ sb9 DLL peut garder l'état interne, donc les mutex peuvent être une solution insuffisante. – Sergio

+0

En outre, les mutex détruiront toute perspective d'évolutivité. –

Répondre

2

Tant que vous utilisez le nom de fichier absolu complet lorsque vous appelez LoadLibrary, et tant que ces noms de fichiers absolus sont différents, vous pouvez charger plusieurs instances.

Personnellement, si elle était moi, je crée le fil, puis copiez le DLL dans un dossier temporaire nommant <threadID>.dll. Cela garantira l'unicité du nom.

+0

Qu'en est-il le cas quand il y a deux DLL chargées qui ont différentes mais le même chemins de fichiers nom de la DLL dans le tableau d'exportation? Lequel des chargeurs devrait utiliser pour résoudre les importations d'un autre module qui sera chargé plus tard? – Sergio

+0

Cette approche crée-t-elle une mémoire unique pour chaque DLL? –

+0

@simon cette question est imprécise. Que voulez-vous dire par mémoire unique –