2010-02-09 7 views
1

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

1

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.

+0

Oui, j'utilise des appels POSIX. Merci. – Adil

1

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:

  1. Utilisez un mutex. La solution la plus simple
  2. 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.

+0

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

2

Vous pouvez essayer d'utiliser la bibliothèque log4cpp.

Questions connexes