J'ai implémenté une bibliothèque partagée multithread en C++ (pour Linux et Windows). Je voudrais ajouter un mécanisme de journalisation à l'intérieur de la bibliothèque elle-même. L'appelant de la bibliothèque n'est pas au courant de cela. Le fichier journal serait le même, donc je me demande comment je pourrais concevoir la journalisation sans fil si plusieurs processus utilisent ma bibliothèque et essayent d'ouvrir et de se connecter au même fichier journal. Aucune suggestion?Journalisation Threadsafe à l'intérieur de la bibliothèque partagée C++
Répondre
Utilisez le verrouillage de fichier. Je crois que fcntl est compatible avec POSIX et devrait donc fonctionner sous Windows. Votre code utilise-t-il les appels Posix?
Avec fcntl, vous devriez pouvoir verrouiller une plage spécifique d'octets. Donc, si vous cherchez à terminer et essayer de verrouiller la quantité d'octets que vous êtes sur le point d'écrire, cela devrait être assez rapide. Pour obtenir le verrou, vous pouvez probablement tourner, abandonnant le processeur pour une petite quantité de temps, si vous n'obtenez pas le verrou.
Votre bibliothèque partage le fichier journal avec l'application cliente? Si c'est le cas, il n'y a absolument aucun moyen de réaliser une journalisation sans fil. Le client pourrait simplement créer un fil et se connecter tout en vous appelant.
Sinon, vous avez deux options:
- Utilisez un mutex. La solution la plus simple
- Avoir un thread de journalisation avec un lock-free (vous serez probablement en mesure de s'en tirer avec un mutex) file d'attente FIFO de messages qui est créé/détruit lorsque votre bibliothèque est créée/détruite. J'espère que vous avez une fonction init/deinit ...
La différence entre les bits 1 et 2 est que pour 1, vous maintenez un mutex pour l'opération d'E/S complète. Dans la seconde, vous ne gardez un mutex que le temps nécessaire pour pousser un message à la fin de la file, ce qui peut être une opération constante si vous le faites correctement.
Merci. Je sais à propos de mutex, mais je pensais que ce serait lent si plusieurs processus utilisent la bibliothèque. La deuxième option est bonne mais encore une fois la bibliothèque n'est pas censée créer de nouveau thread, c'est une restriction. Mais merci beaucoup pour l'idée. – Adil
Vous pouvez essayer d'utiliser la bibliothèque log4cpp.
- 1. Journalisation Threadsafe
- 2. C partagée question bibliothèque
- 3. bibliothèque partagée en C
- 4. Lien une bibliothèque partagée statique à ma bibliothèque partagée
- 5. fonction de modèle transmis à la bibliothèque partagée (C++)
- 6. taille de fichier de la bibliothèque partagée
- 7. création de bibliothèque partagée à partir de C++
- 8. Bibliothèque partagée Linux qui utilise une bibliothèque partagée non définie
- 9. Puis-je créer une bibliothèque partagée qui a à la fois bibliothèque statique et partagée?
- 10. comment lier la bibliothèque partagée par rapport à une autre bibliothèque partagée sous Linux?
- 11. bibliothèque partagée sous Ubuntu
- 12. Création d'une bibliothèque partagée à partir du fichier source C++
- 13. C#/IronPython Interop avec bibliothèque de classes C# partagée
- 14. Remplacement de la bibliothèque partagée sous AIX
- 15. C# treeview opérations threadsafe
- 16. variables statiques/globales dans la bibliothèque partagée en langage C
- 17. Bibliothèque statique en fonction de la bibliothèque partagée
- 18. Charger plusieurs copies d'une bibliothèque partagée
- 19. Cadre de chargement de bibliothèque partagée dynamique
- 20. comment forcer l'éditeur de liens à utiliser la bibliothèque partagée au lieu de la bibliothèque statique?
- 21. Classes abstraites dans la bibliothèque partagée
- 22. Compilation de bibliothèque partagée dynamique avec g ++
- 23. outils/bibliothèque pour la journalisation non invasive
- 24. Tous les processus utilisent la bibliothèque partagée
- 25. CMake: Bibliothèque partagée qui utilise la bibliothèque statique
- 26. Liaison d'erreurs lors de la création d'une bibliothèque partagée
- 27. Compiler une bibliothèque partagée statiquement
- 28. Non disponible Bibliothèque partagée - INSTALL_FAILED_MISSING_SHARED_LIBRARY
- 29. Quel est l'effet de la déclaration de «extern» C "'dans l'en-tête d'une bibliothèque partagée C++?
- 30. erreur de symbole non défini pour la classe de base dans la bibliothèque partagée C de
Oui, j'utilise des appels POSIX. Merci. – Adil