IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Delete d'un membre static de classe


Sujet :

C++

  1. #41
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par Astraya Voir le message
    C'est le but d'un RAII. Tout ce qui nécessite une symétrie. Fichier, BDD, DLL... Dans le standard, la fermeture lève une exception interne qui apparait si il n'y a rien d'ouvert, donc dans tout les cas rien ne sera resté vacant.
    Oui, close peut lèver une excpetion, mais le destructeur de fstream n'en lève pas, d'où la nécessité d'appeler close explicitement si tu veus explicitement traiter les exceptions, sinon elles seront simplement ignorées).

  2. #42
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Dans certains milieu, traiter toutes les exceptions possible n'est pas envisageable. Voir n'en traiter aucune et tout faire crashé car il considère que c'est un évènement trop grave pour continuer (Jeu vidéo). Traiter l'exception de close dans le destructeur d'un RAII relève d'une chose futile puisque si il est correctement fait, cela devras être traiter au l'ouverture et non a la fermeture. Si tu le traite tu reviens à faire : "Oh , une exception! Bas c'est pas grave le fichier n'est pas ouvert."

  3. #43
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    J'ai bien précisé : si l'ont veut les traiter, et ceci depuis mon premier message. (si le traitement du destructeur suffit c'est très bien, ie ne rien faire)

    D'autre part si le fichier n'est pas ouvert ca ne lance pas d'exception. Ce qui peut lancer des exceptions ce sont les opérations qui termine les opérations sur le fichier avant de le fermer.

    A noter qu'en cas d'exception le fichier est quand même fermer, mais un exception indique quand même bien que quelque chose s'est mal passé, information qui peut être utile si les données du fichier sont importantes.

    Quand à traiter les exception dans le destructeur d'une classe RAII-sante, si les opérations du destructeur peuvent lancer des excpetions tu as pas le choix de les récupérer, et d'en faire quelque chose (rien, traitement, crash, autre), un destructeur ne doit jamais lancer d'exception. (bon d'accord, les ignoré ce n'est pas vraiment un traitement, n'empêche qu'il ne faut pas oublier de le faire)

  4. #44
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Enfaite il faudrait appeler ce post le post DEBAT

  5. #45
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @white_tentacle: T'aurais un bench ? j'ai toujours entendue dire que locker un mutex était lent. (C'est d'ailleurs ce qui est dit dans MC++D, mais ca ne m'étonnerait pas que ca ai changé).
    Cela dépend des architectures, mais dans la plupart des cas, "lent" est équivalent à "négligeable". A moins de faire du vrai temps réel ou quelque chose de critique en performance.

    Pour les benchs, j'ai trouvé ça (c'est un papier qui explique les avantages du double-checked locking, donc s'il est biaisé ce serait plutôt dans l'autre sens) :

    http://www.cs.wustl.edu/~schmidt/PDF/DC-Locking.pdf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Singleton Mutex Double- ACE
    Implementation Checked
    real time (secs) 442.64 30.22 30.88
    user time (secs) 441.47 30.12 30.86
    time per call (usecs) 4.43 0.30 0.31
    system time (secs) 0 0 0
    Il y a certes un facteur 15 (rien d'étonnant à ça), mais on parle bien de 4µs pour prendre et releaser le mutex. Négligeable dans la plupart des cas .

  6. #46
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Dans certains milieu, traiter toutes les exceptions possible n'est pas envisageable. Voir n'en traiter aucune et tout faire crashé car il considère que c'est un évènement trop grave pour continuer (Jeu vidéo). Traiter l'exception de close dans le destructeur d'un RAII relève d'une chose futile puisque si il est correctement fait, cela devras être traiter au l'ouverture et non a la fermeture. Si tu le traite tu reviens à faire : "Oh , une exception! Bas c'est pas grave le fichier n'est pas ouvert."
    Le problème, c'est que ton objet n'est pas tout seul dans son coin, il dépend aussi d'un contexte système. Et ce n'est pas parce que l'ouverture de ton fichier s'est parfaitement bien passée que la fermeture se passera bien (exemple : à la fermeture, j'ai besoin de finaliser l'écriture de mon buffer, je me prends une erreur disk-full...). Le RAII est bien pour les objets qui ne dépendent pas d'un contexte extérieur, pour les autres il montre des limites.

  7. #47
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    à la fermeture, j'ai besoin de finaliser l'écriture de mon buffer, je me prends une erreur disk-full
    Ok mais ça ce fera au moment de l'écriture après chaque flush, pas de la fermeture, donc pas dans le destructeur (Il n'y as pas de raison d'avoir un flush dans le destructeur ou autre que le close)

  8. #48
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Ok mais ça ce fera au moment de l'écriture après chaque flush, pas de la fermeture, donc pas dans le destructeur (Il n'y as pas de raison d'avoir un flush dans le destructeur ou autre que le close)
    Il y a une raison, c'est qu'on ne flushe pas à chaque écriture, et que l'appel de flush n'est pas obligatoire. Donc quand je ferme, je suis obligé de regarder si je n'ai pas des données en attente de flush.

    Un autre exemple où la fermeture de fichier peut foirer : je lit un fichier à travers le réseau, avant ma fermeture la connexion réseau tombe : je ne peux plus fermer le fichier. Ce cas peut-être problématique ou pas (dépend de la politique du système de partage de fichiers).

    RAII fonctionne bien, RFID fonctionne bien si le F est sûr de réussir, où que les conséquences de son échec sont acceptables. Il faut le garder en tête quand on fait du RAII.

  9. #49
    screetch
    Invité(e)
    Par défaut
    Il me semblait que le double lock était en fait non thread safe, parce que il etait possible que l'assignation pouvait être effectuée avant que le constructeur soit appelé d'òu un crash si un autre thread y accède entre les deux.

  10. #50
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par screetch Voir le message
    Il me semblait que le double lock était en fait non thread safe, parce que il etait possible que l'assignation pouvait être effectuée avant que le constructeur soit appelé d'òu un crash si un autre thread y accède entre les deux.
    Dépend comment tu l'écris, dépend des modèles mémoires, etc... Mais c'est une des raisons pour lesquelles il peut foirer (une autre étant, par exemple, la copie de pointeur non atomique).

  11. #51
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Ok mais ça ce fera au moment de l'écriture après chaque flush, pas de la fermeture, donc pas dans le destructeur (Il n'y as pas de raison d'avoir un flush dans le destructeur ou autre que le close)
    Il n'y a rien d'autre que close dans le destructeur (à vérifier quand même), mais c'est dans close qu'il y a d'autre opérations que simplement tester si le fichiers est ouvert, et ces opérations peuvent lancer des excpetions (opérations de finalisation du fichier avant fermeture). D'où le besoin de le faire explicitement si l'on veut s'assurer que la fermeture c'est totalement bien passé.

    Le problème du DCLP est bien l'ordre entre l'assignation et l'allocation, et le fait qu'il n'existe pas de méthode portable pour palier à ce problème. (cf un article de Meyers et Alexandrescu paru au ddj)

    @white_tentacle: Très intéresent le bench. Et je suis d'accord que si il n'y a pas besoin d'un accés rapide, alors locker à chaque peut être très bien (cas d'un journal d'erreur géré par un singleton). Mais pas dans tout les cas, exemple, un allocateur mémoire pour les petits objets basé sur un singleton (genre Loki::SmallObject), un facteur de 15 n'est pas acceptable (j'ai pas de bench mais ca doit compenser le temps gagner par rapport à une allocation classique).

    C'est comme pour ce qui concerne la gestion de la destruction et de la création, ca dépend de l'objectif recherché.

Discussions similaires

  1. utiliser les méthodes d'un membre static d'une classe
    Par tonio_a_588 dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2011, 21h44
  2. Appel membre static dans une autre classe
    Par cyriltec dans le forum C#
    Réponses: 2
    Dernier message: 12/04/2010, 11h23
  3. Réponses: 3
    Dernier message: 12/01/2006, 21h26
  4. pointeur membre static de classe
    Par Ca$ul dans le forum C++
    Réponses: 3
    Dernier message: 26/08/2004, 13h02
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo