Respuesta corta:
Sí, en general es posible llamar a una función DLL desde varios subprocesos, ya que cada hilo tiene su propia pila y llamar a una función DLL es más o menos lo mismo que llamar a cualquier otro función de tu propio código
Respuesta larga:
Si es realmente posible depende de las funciones DLL utilizando un compartían estado mutable o no.
Por ejemplo si haces algo como esto:
DLL_SetUser(UserName, Password)
if DLL_IsAuthenticated then
begin
...
end;
entonces es sin duda no seguro para ser utilizado de diferentes temas. En este ejemplo, no puede garantizar que entre DLL_SetUser
y DLL_IsAuthenticated
ningún otro hilo haga una llamada diferente al DLL_SetUser
.
Pero si las funciones DLL no dependen de algún tipo de estado predefinido, es decir, todos los parámetros necesarios están disponibles a la vez y todas las demás configuraciones son iguales para todos los subprocesos, puede suponer que funcionarán.
if DLL_IsAuthenticated(UserName, Password) then
begin
...
end;
Pero tenga cuidado: es posible que una función DLL parezca atómica, pero internamente usa algo, que no lo es. Si, por ejemplo, si el archivo DLL crea un archivo temporal con siempre el mismo nombre o si accede a una base de datos que solo puede gestionar una solicitud a la vez, cuenta como un estado compartido. (Lo siento, no podía pensar en mejores ejemplos)
Resumen:
Si dicen los vendedores DLL, que sus archivos DLL son hilos de proceso seguro que haría uso de ellos desde varios subprocesos sin bloquear. Si no lo están, o incluso si los proveedores no lo saben, debes ir a lo seguro y usar el bloqueo.
Al menos hasta que encuentre problemas de rendimiento. En ese caso, podría intentar crear múltiples aplicaciones/procesos que envuelvan sus llamadas a DLL y las usen como servidores proxy.
Otro ejemplo podría ser una estructura de datos interna donde las funciones exportadas agregan y/o eliminan elementos, como una lista de solicitudes de autenticación (fallidas) o una lista de usuarios autenticados. – mghie