2017-07-08 8 views
1

This is a link to an MCVE that demonstrates the deadlockPourquoi le blocage inter-processus de boost est-il dans notify_one?

Il contient cinq parties:

  1. SharedEvent est une implémentation d'un AutoResetEvent qui est stocké dans la mémoire partagée. CreatedSharedEvent crée un objet de mémoire partagée nommé dans lequel un événement SharedEvent est alloué. Il fournit une méthode d'accès qui renvoie une référence à SharedEvent. OpenedSharedEvent ouvre un objet de mémoire partagée nommé dans lequel un objet SharedEvent a déjà été alloué. Il fournit également une méthode accesseur qui renvoie une référence à SharedEvent.

  2. Une application de console de serveur qui crée un événement SharedEvent à l'aide d'un événement CreatedShareEvent et définit l'événement toutes les 2 secondes. Il imprime un message à chaque fois que l'événement est défini.

  3. Une application de console qui ouvre l'événement partagé à l'aide d'un OpenedShareEvent et attend l'événement dans une boucle. Il imprime un message chaque fois que l'appel d'attente revient.

Pour reproduire le problème:

  1. exécuter le serveur. Observez les messages imprimés toutes les 2 secondes.

  2. Exécutez le client. Observez les messages imprimés toutes les 2 secondes.

  3. Fermez le client. Observez que le serveur cesse d'imprimer des messages. Il est bloqué dans interprocess_condition :: notify_one()

+0

Encore une fois [vous venez à nous avec beaucoup de prose, et pas de code] (https://stackoverflow.com/questions/44982935/can-boosts-interprocess-segment-manager-allocators-be-themselves-shared- avec-ot/44987240 # comment76944259_44982935). "Ce qui pourrait causer l'impasse" - un certain nombre de choses. Nous sommes plus susceptibles de voir si nous pouvons [_voir votre code_] (https://stackoverflow.com/questions/44982935/can-boosts-interprocess-segment-manager-allocators-be-themselves-shared-with-ot/44987240 # comment76954354_44987240). – sehe

+0

Cette fois, je vais attendre que vous fassiez un [SSCCE] (http://sscce.org/) ou [MCVE] (https://stackoverflow.com/help/mcve). Les liens vous disent comment. Ma réponse précédente _show you_ comment. – sehe

+0

J'ai fourni un lien vers le MCVE dans ma question éditée –

Répondre

0

La cause du problème est le même que celui décrit here:

Cette utilisation de interprocessus boost ne peut pas être utilisé dans une situation où un processus peut se bloquer et toujours tenir la serrure.

Je vais poster une question différente pour voir si quelqu'un a découvert un bon remplacement pour boosts condition_variable et interprocess_mutex.

+1

J'ai atteint la même conclusion. J'ai testé le stress depuis que vous avez publié le SSCCE. Je ne peux pas le faire échouer à moins que je mets fin à des clients avec force. J'ai couru le serveur pendant des heures avec un message chaque 1ms et 52 clients simultanés qui se sont fermés volontairement après 50..250 messages reçus. Ce n'est que lorsque je commence parfois à tuer les clients en mi-exécution (ils réapparaissent) que je vois le serveur se bloquer. Sinon, le serveur continue à fonctionner pendant des heures et des millions de messages sont envoyés (par exemple 446 minutes et 25 608 540 messages envoyés) – sehe

+0

Je suis actuellement en train d'exécuter le même test de stress en utilisant d'autres primitives de synchronisation. [C'est sur linux pour l'instant.] – sehe

+1

Comme probablement prévu, l'utilisation de 'named_mutex' et' named_condition' ne résout pas le problème. Je l'ai fait verrouiller en 12 minutes, à tel point que le serveur a été suspendu dans 'notify_one'. Le code au cas où vous êtes intéressé: https://gist.github.com/sehe/812b11ab5b9bc64804296d29f8d6e20a – sehe