Bonjour,
Est-il possible d'avoir une FIFO dans une dll avec le push et le pop appelés par deux autres dll ?
Merci
Nicolas
Strasbourg
Bonjour,
Est-il possible d'avoir une FIFO dans une dll avec le push et le pop appelés par deux autres dll ?
Merci
Nicolas
Strasbourg
Bonjour,
Ça dépend de problèmes d'allocation.
(Note: Une FIFO n'a pas de push()/pop(), c'est pour du LIFO ça. En FIFO, on utilise plutôt enqueue()/dequeue(), ou post()/get(), etc.)
Si ta FIFO ne fait aucune allocation sur les objets eux-mêmes (genre, tu lui passes juste un pointeur et tu rècupères un pointeur, la FIFO ne détruit jamais elle-même un objet), alors cette FIFO peut être dans une DLL indépendante sans problème aucun.
Par contre, une fois la première question réglée, il peut y avoir un problème au niveau des utilisateurs: S'il y a une DLL qui produit et l'autre qui consume, la DLL consommatrice ne devra pas désallouer elle-même : Elle devra appeler une fonction de la DLL productrice (pourquoi pas via une interface, pour éviter une dépendance) pour détruire les objets.
Exemple:
Code DLL FIFO: : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 static void FIFO_Enqueue(void *pData) { //L'implémentation peut utiliser n'importe quoi ici : Liste, malloc(), new... //Mais on ne tente pas de copier les données: //On ne manipule que le pointeur, et on le stocke en tant que pointeur. } static void * FIFO_Dequeue() { //L'implémentation peut utiliser n'importe quoi ici : Liste, free(), delete... //Mais on ne tente pas de copier les données: //On ne manipule que le pointeur, et on le stocke en tant que pointeur. } void FifoEnqueueObject(FifoObject *pObj) { //On ne touche pas à l'objet lui-même: //Aucune allocation, désallocation ou opération de copie: //On ne manipule que le pointeur, et on le stocke en tant que pointeur. FIFO_Enqueue(pObj); } void FifoDequeueObject() { //On ne touche pas à l'objet lui-même: //Aucune allocation, désallocation ou opération de copie: //On ne manipule que le pointeur, et on le stocke en tant que pointeur. return static_cast<FifoObject * >(FIFO_dequeue()); }
Code DLL Productrice : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void Produce() { FifoEnqueueObject(new FifoObject); } void Destroy(FifoObject *pObj) { delete pObj; }
Code DLL Consommatrice : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void Consume(void (*destroyProc)(FifoObject*)) { FifoObject * pObj = FifoDequeueObject(); //On ne détruit pas l'objet soi-même : On appelle la fonction. destroyProc(pObj); }
Dans cet exemple,
- les allocations et désallocations internes de la FIFO elle-même sont faites par la DLL de la FIFO;
- les allocations et désallocations d'objets sont faites par la DLL productrice.
Erreur d'expression entre pile et queue pour le pop/push...
Sinon, je pensais faire l'allocation dans la dll "queue". Les 2 autres dll sont exécutés dans le même process (2 thread différents).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Code inclu dans la dll : http://nicolasj.developpez.com/articles/file/#LVI
J'ignore si tu as pu lire tout mon dernier post (j'ai édité depuis).
Dans mon exemple, les allocations internes à la liste et les allocations externes à la liste sont convenablement séparées.
PS: Je viens de voir que la STL avait fait la même erreur pour les queues, en appelant ses méthodes push() et pop(), ô hérésie.
PPS: Tiens, post()/get(), le tutoriel, lui, donne des noms raisonnables.
Quoi qu'il en soit, cette structure de queue ne fait que des allocations internes, elle est donc appropriée pour mon exemple.
Si j'ai bien compris, la queue ne fait de la manipulation de pointeurs.
On a aucune copie de données.
Comme la mémoire est partagée (même processus), le consommateur sait où chercher l'information (chez le producteur).
Merci beaucoup Médinoc pour ta réactivité.
Nicolas
strasbourg
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager