thread-safety et buffers - C - Programmation
Marsh Posté le 22-01-2009 à 10:43:27
tu fais bien le printf de ton buffer à l'intérieur de ton mutex , juste après que ton buffer soit initilaisé à une new valeur ?
Marsh Posté le 22-01-2009 à 10:45:13
mon mutex n'encadre que l'envoi et la réception via la socket. Faudrait-il qu'il encadre tout, depuis la libération du buffer jusqu'à sa prochaine libération ?
Marsh Posté le 22-01-2009 à 10:52:55
qu'appels tu libération du buffer ? à part le moment qui correspond au relachement du mutex je ne vois pas et si c'est le cas, je comprends pas ta question... moi ce que je te disais c'est qu'il peut y avoir un problème de synchronisme entre ce que ton buffer contient à un moment X et ce que tu affiches à une date Y. En ce somme que ton programme peut fonctionner parfaitement, mais que ton affichage ne soit pas synchronisé sur le contenu réel de ton buffer. Mais c'est juste une piste possible
Marsh Posté le 22-01-2009 à 14:12:30
Pas terrible comme design. Fais plutôt un thread à la syslog: une file de message, un thread qui les affiche et les autres thread poussent des messages vers ce logger.
Marsh Posté le 22-01-2009 à 14:50:54
oui c'est mieux c'est clair, je valide
Marsh Posté le 23-01-2009 à 09:31:19
bon j'ai réajusté la position des mutex pour que le buffer ne soit pas écrasé.
Pour les logs je m'y pencherai plus tard ce n'est pas prioritaire.
Par contre, mon programme ne tourne toujours pas. J'obtiens maintenant un crash pour case de SIGPIPE broken. D'après la doc, cela arrive lorsque on essaye de manipuler une socket qui est invalide. Pourtant, ma socket s'établit bien.
Une quelconque idée de l'origine diu problème ?
Voici un bout de mon code :
http://pastebin.com/m70d34405
Marsh Posté le 22-01-2009 à 10:12:32
Bonjour,
j'ai écrit un programme qui communique avec des boitiers contenant du C embarqué. Pour chacun de ces boitiers, j'ai une socket et trois threads, qui envoient des commandes et reçoivent le résultat.
Le problème est que lorsque j'affiche le contenu du buffer, de temps en temps il contient la valeur du résultat d'une autre commande. J'ai dissocié les buffer pour chaque thread afin d'éviter le problème mais cela continue. J'ai aussi posé des mutex avant et après chaque utilisation des commandes et buffer, et je vide le buffer dès que j'en ai plus besoin. Je me demande ce que j'ai pu omettre pour éviter qu'un buffer soit écrasé. Je compile avec les options :
#define _GNU_SOURCE
#define _REENTRANT
#define _THREAD_SAFE
Mais apparemment cela ne suffit pas pour que mes instructions soient thread-safe.
Une idée ?