Slt à tous, j’ai développé une Dll qui me permet d’accéder à un serveur de type OPC.
Le truc, c’est que j’ai plusieurs processus qui accèdent aux données de ce serveur en parallèle (le processus A accède aux données alpha, le processus B aux données béta, le processus C aux données alpha et gamma…)
Donc, j’aimerais savoir plusieurs petit trucs:
par défaut, comment est géré l’accès de plusieurs process qui fonctionnent en // à une même fonction d’une même Dll?
(induit du 1 mais purement hypotétique à cet instant) comment rendre l’accès à cette fonction de cette Dll possible à plusieurs threads, et donc sans les bloquer (c’est à dire que si A utilise la fonction, je ne veux pas que B attende que A ait terminé)
Merci à ceux qui saurons m’apporter des réponses ou des liens vers ce sujet (j’ai cherché, mais Google n’est pas mon ami sur le coup là)
Je ne sais pas ce qu’il en est pour les dll, mais normalement (sous linux, avec les Shared Objects, mais c’est pareil). Ta mémoire est paginée, et ta dll tient sur ces pages : quand un de tes programmes modifie les données de la dll (par exemple, ta dll a des variables statiques) elle est copiée “copy on write” au lieu d’être simplement partagé.
Donc pour les processus, pas trop de soucis normalement.
Pour les threads, c’est autre chose puisque la dll est partagée entre eux, sans copie… et à moins qu’elle utilise des variables de thread (je crois que tu peux avec les threads, faire des variables associés à un thread, évitant les écritures concurrentes) ta dll n’est pas thread safe si elle des variables globales ou statiques.
Pour contrer ça? Ben thread => mutex => lock genre tes protos deviennent ça :
static pthread_mutex m = … ; (faut voir le man pthread_mutex, et pareil pour win)
int x(...)
{
... déclaration des types ...
pthread_mutex_lock(m);
...
if ( erreur )
{
pthread_mutex_unlock(m);
return;
}
...
pthread_mutex_unlock(m);
}
Là, ta dll devrait être thread-safe à condition de trouver les équivalents win32
Pour ce qui est threads, je sais pas quelle API tu vas utiliser, mais si c’est pthread, c’est portable donc tu devrais trouver de la doc facilement avec google. -> http://sources.redhat.com/pthreads-win32/
Par contre, les threads natives win32, je dirais msdn à tout hasard (même si c’est pas biffable comme site).