James Kanze writes:
| Gabriel Dos Reis wrote:
| > James Kanze writes:
| > | Ça dépend. Dans la pratique, je crois que la plupart
| > | (exception fait de g++) donne les même garanties que
| > | pour un objet de base (ou un tableau de type C).
| > Puisque tu répètes ceci dans tout ce fil, sans que je
| > puisse comprendre ce que tu voulais dire, je serais
| > heureux d'en voir un élaboration plus claire.
| Il faudrait que j'en fasse une FAQ -- c'est la troisième
| fois ce mois-ci qu'on me le démande:-).
désolé de pas suivre tes écrits à la virgules près ces
derniers temps -- il y a tellement de monde qui demande qu'on
les lise tous les jours que cela devient un vrai
embouteillage.
| Sans entrer dans tous les détails en ce qui concerne où il y
| a le problème dans le code (je te les fournirais si tu veux,
| mais ça risque d'ennuyer les autres ici, étant donné que
| c'est du propre à g++),
Puisque tu as jugé que cela n'ennuyerait pas les autres de
repéter cette remarque encore et encore, je crois qu'il est
tout à fait bienvenu et souhaité que tu donnes ces problèmes
ici. On pourra toujours arrêté si cela devient du hardcore.
| le problème est simple : si j'ai une instance de std::string
| que je veux accéder depuis plusieurs threads, il faut que je
| synchronise les accès avec g++, même si aucun des accès ne
| modifie la chaîne.
???
Pas plus tard qu'hier, j'ai reçu un mail (avec copie à
d'autres maintainers de la GNU libstdc++ ainsi que Nathan
Myers, l'auteur principal de std::string dans GNU libstdc++,
et en CC: de ce message) reflétant des inquiétudes (FUD ?)
d'un utilisateur qui aurait lu des messages récents sur les
newsgroupes alléguant des propos proches de ceux que tu viens
de tenir -- je ne sais pas s'ils viennent de toi ou non, donc
ne saute pas au plafond avant d'avour lu la suite. La réponse
qu'il a reçue est en très grand contraste avec ce que tu
affirmes, alors j'apprecierais tu nous donnes plus de
précisions.
| Je suis prèsque sûr d'avoir vue quelque part dans la
| documentation g++ que c'est exprès -- que g++ ne veut pas
| donner d'avantage de garanties. Ce qui est dommage, parce
| que Posix, lui, en exige plus -- selon Posix, je peux
| accéder à un objet depuis plusieurs threads sans
| synchronisation externe dans la mésure qu'aucun thread ne
| modifie l'objet.
Et tu as fait des tests qui ont montré que cette guarantie ne
tien pas ? Si tu l'as fait, je serai (et sûrement Nathan Myers
aussi) curieux d'avoir des données plus précises -- au delà
d'un flou nébuleux. (Je reconnais d'avance que faire des tests
pour des programmes multi-thread n'est pas facile).
James Kanze <kanze@none> writes:
| Gabriel Dos Reis wrote:
| > James Kanze <kanze@none> writes:
| > | Ça dépend. Dans la pratique, je crois que la plupart
| > | (exception fait de g++) donne les même garanties que
| > | pour un objet de base (ou un tableau de type C).
| > Puisque tu répètes ceci dans tout ce fil, sans que je
| > puisse comprendre ce que tu voulais dire, je serais
| > heureux d'en voir un élaboration plus claire.
| Il faudrait que j'en fasse une FAQ -- c'est la troisième
| fois ce mois-ci qu'on me le démande:-).
désolé de pas suivre tes écrits à la virgules près ces
derniers temps -- il y a tellement de monde qui demande qu'on
les lise tous les jours que cela devient un vrai
embouteillage.
| Sans entrer dans tous les détails en ce qui concerne où il y
| a le problème dans le code (je te les fournirais si tu veux,
| mais ça risque d'ennuyer les autres ici, étant donné que
| c'est du propre à g++),
Puisque tu as jugé que cela n'ennuyerait pas les autres de
repéter cette remarque encore et encore, je crois qu'il est
tout à fait bienvenu et souhaité que tu donnes ces problèmes
ici. On pourra toujours arrêté si cela devient du hardcore.
| le problème est simple : si j'ai une instance de std::string
| que je veux accéder depuis plusieurs threads, il faut que je
| synchronise les accès avec g++, même si aucun des accès ne
| modifie la chaîne.
???
Pas plus tard qu'hier, j'ai reçu un mail (avec copie à
d'autres maintainers de la GNU libstdc++ ainsi que Nathan
Myers, l'auteur principal de std::string dans GNU libstdc++,
et en CC: de ce message) reflétant des inquiétudes (FUD ?)
d'un utilisateur qui aurait lu des messages récents sur les
newsgroupes alléguant des propos proches de ceux que tu viens
de tenir -- je ne sais pas s'ils viennent de toi ou non, donc
ne saute pas au plafond avant d'avour lu la suite. La réponse
qu'il a reçue est en très grand contraste avec ce que tu
affirmes, alors j'apprecierais tu nous donnes plus de
précisions.
| Je suis prèsque sûr d'avoir vue quelque part dans la
| documentation g++ que c'est exprès -- que g++ ne veut pas
| donner d'avantage de garanties. Ce qui est dommage, parce
| que Posix, lui, en exige plus -- selon Posix, je peux
| accéder à un objet depuis plusieurs threads sans
| synchronisation externe dans la mésure qu'aucun thread ne
| modifie l'objet.
Et tu as fait des tests qui ont montré que cette guarantie ne
tien pas ? Si tu l'as fait, je serai (et sûrement Nathan Myers
aussi) curieux d'avoir des données plus précises -- au delà
d'un flou nébuleux. (Je reconnais d'avance que faire des tests
pour des programmes multi-thread n'est pas facile).
James Kanze writes:
| Gabriel Dos Reis wrote:
| > James Kanze writes:
| > | Ça dépend. Dans la pratique, je crois que la plupart
| > | (exception fait de g++) donne les même garanties que
| > | pour un objet de base (ou un tableau de type C).
| > Puisque tu répètes ceci dans tout ce fil, sans que je
| > puisse comprendre ce que tu voulais dire, je serais
| > heureux d'en voir un élaboration plus claire.
| Il faudrait que j'en fasse une FAQ -- c'est la troisième
| fois ce mois-ci qu'on me le démande:-).
désolé de pas suivre tes écrits à la virgules près ces
derniers temps -- il y a tellement de monde qui demande qu'on
les lise tous les jours que cela devient un vrai
embouteillage.
| Sans entrer dans tous les détails en ce qui concerne où il y
| a le problème dans le code (je te les fournirais si tu veux,
| mais ça risque d'ennuyer les autres ici, étant donné que
| c'est du propre à g++),
Puisque tu as jugé que cela n'ennuyerait pas les autres de
repéter cette remarque encore et encore, je crois qu'il est
tout à fait bienvenu et souhaité que tu donnes ces problèmes
ici. On pourra toujours arrêté si cela devient du hardcore.
| le problème est simple : si j'ai une instance de std::string
| que je veux accéder depuis plusieurs threads, il faut que je
| synchronise les accès avec g++, même si aucun des accès ne
| modifie la chaîne.
???
Pas plus tard qu'hier, j'ai reçu un mail (avec copie à
d'autres maintainers de la GNU libstdc++ ainsi que Nathan
Myers, l'auteur principal de std::string dans GNU libstdc++,
et en CC: de ce message) reflétant des inquiétudes (FUD ?)
d'un utilisateur qui aurait lu des messages récents sur les
newsgroupes alléguant des propos proches de ceux que tu viens
de tenir -- je ne sais pas s'ils viennent de toi ou non, donc
ne saute pas au plafond avant d'avour lu la suite. La réponse
qu'il a reçue est en très grand contraste avec ce que tu
affirmes, alors j'apprecierais tu nous donnes plus de
précisions.
| Je suis prèsque sûr d'avoir vue quelque part dans la
| documentation g++ que c'est exprès -- que g++ ne veut pas
| donner d'avantage de garanties. Ce qui est dommage, parce
| que Posix, lui, en exige plus -- selon Posix, je peux
| accéder à un objet depuis plusieurs threads sans
| synchronisation externe dans la mésure qu'aucun thread ne
| modifie l'objet.
Et tu as fait des tests qui ont montré que cette guarantie ne
tien pas ? Si tu l'as fait, je serai (et sûrement Nathan Myers
aussi) curieux d'avoir des données plus précises -- au delà
d'un flou nébuleux. (Je reconnais d'avance que faire des tests
pour des programmes multi-thread n'est pas facile).
writes:
[...]
| Si on régarde à
| http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html#3,
| on voit la phrase « We currently use the same definition
| that SGI uses for their STL subset. However, the exception
| for read-only containers only applies to the STL components.
| » C'est assez ingenieux, étant donné que 1) SGI ne parle pas
| d'une « exception », et 2) ce que SGI garantit n'est qu'une
| expression de la garantie Posix, traduite en termes de C++.
| (Pour citer la norme Posix : « Applications shall ensure
| that access to any memory location by more than one thread
| of control (threads or processes) is restricted such that no
| thread of control can read or modify a memory location while
| another thread of control may be modifying it. »)
| D'après mes souvenirs, autrefois, le passage dans la
| documentation libstdc++ était bien plus clair. On spécifiait
Je ne sais pas. Très clairement la version de la bibliothèque
de GCC avant 2.95.x n'avait aucune gaurantie thread-safety --
de fait, était connu comme ayant ces problèmes.
Mais c'était connu comme V2
http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#4_4_interface
| noir sur blanc les garanties de la bibliothèque libstdc++,
| et ensuite, on signalait une garantie supplémentaire pour la
| partie STL. Ça laissait ouvert la question : pourquoi est-ce
| qu'on n'a pas jugé utile de fournir les même garanties, mais
| au moins, ça rendait clair qu'on garantissait moins. Le
| texte aujourd'hui cite seulement les garanties SGI, puis en
| parle d'une exception ; à le lire, on dirait que la partie
| STL fournit moins de garanties que la reste.
| En tout cas, le fait reste que Posix fait un certain nombre
| de garanties en ce qui concerne les threads. Il ne définit
| pas de binding C++, ce qui laisse un peu en l'air ce qu'il
| faut faire pour être conforme en C++, mais en général, ce
| n'est pas trop difficile exterpoler (et dans au moins un cas
| où l'exterpolation n'était pas évidente, ils ont ajouté du
| commentaire pour aider). Par rapport à ce que dit Posix, g++
| a au moins deux problèmes : il n'appelle pas les
| destructeurs en cas de pthread_cancel (au
Oui mais est-ce que Posix dit qu'il faut appeler le
destructeur s'il y a un pthread_cancel ?
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
Bnone lecture avant de me dire que je réponds à une autre
question.
La réponse est que si tu penses qu'il y a un problème avec
accès en lecture (sans modification) concurrente il faut faire
un rapport de bug avec un cas de test. Nathan est en encore en
CC: de ce message et tu connais aussi son adresse.
kanze@gabi-soft.fr writes:
[...]
| Si on régarde à
| http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html#3,
| on voit la phrase « We currently use the same definition
| that SGI uses for their STL subset. However, the exception
| for read-only containers only applies to the STL components.
| » C'est assez ingenieux, étant donné que 1) SGI ne parle pas
| d'une « exception », et 2) ce que SGI garantit n'est qu'une
| expression de la garantie Posix, traduite en termes de C++.
| (Pour citer la norme Posix : « Applications shall ensure
| that access to any memory location by more than one thread
| of control (threads or processes) is restricted such that no
| thread of control can read or modify a memory location while
| another thread of control may be modifying it. »)
| D'après mes souvenirs, autrefois, le passage dans la
| documentation libstdc++ était bien plus clair. On spécifiait
Je ne sais pas. Très clairement la version de la bibliothèque
de GCC avant 2.95.x n'avait aucune gaurantie thread-safety --
de fait, était connu comme ayant ces problèmes.
Mais c'était connu comme V2
http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#4_4_interface
| noir sur blanc les garanties de la bibliothèque libstdc++,
| et ensuite, on signalait une garantie supplémentaire pour la
| partie STL. Ça laissait ouvert la question : pourquoi est-ce
| qu'on n'a pas jugé utile de fournir les même garanties, mais
| au moins, ça rendait clair qu'on garantissait moins. Le
| texte aujourd'hui cite seulement les garanties SGI, puis en
| parle d'une exception ; à le lire, on dirait que la partie
| STL fournit moins de garanties que la reste.
| En tout cas, le fait reste que Posix fait un certain nombre
| de garanties en ce qui concerne les threads. Il ne définit
| pas de binding C++, ce qui laisse un peu en l'air ce qu'il
| faut faire pour être conforme en C++, mais en général, ce
| n'est pas trop difficile exterpoler (et dans au moins un cas
| où l'exterpolation n'était pas évidente, ils ont ajouté du
| commentaire pour aider). Par rapport à ce que dit Posix, g++
| a au moins deux problèmes : il n'appelle pas les
| destructeurs en cas de pthread_cancel (au
Oui mais est-ce que Posix dit qu'il faut appeler le
destructeur s'il y a un pthread_cancel ?
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
Bnone lecture avant de me dire que je réponds à une autre
question.
La réponse est que si tu penses qu'il y a un problème avec
accès en lecture (sans modification) concurrente il faut faire
un rapport de bug avec un cas de test. Nathan est en encore en
CC: de ce message et tu connais aussi son adresse.
writes:
[...]
| Si on régarde à
| http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html#3,
| on voit la phrase « We currently use the same definition
| that SGI uses for their STL subset. However, the exception
| for read-only containers only applies to the STL components.
| » C'est assez ingenieux, étant donné que 1) SGI ne parle pas
| d'une « exception », et 2) ce que SGI garantit n'est qu'une
| expression de la garantie Posix, traduite en termes de C++.
| (Pour citer la norme Posix : « Applications shall ensure
| that access to any memory location by more than one thread
| of control (threads or processes) is restricted such that no
| thread of control can read or modify a memory location while
| another thread of control may be modifying it. »)
| D'après mes souvenirs, autrefois, le passage dans la
| documentation libstdc++ était bien plus clair. On spécifiait
Je ne sais pas. Très clairement la version de la bibliothèque
de GCC avant 2.95.x n'avait aucune gaurantie thread-safety --
de fait, était connu comme ayant ces problèmes.
Mais c'était connu comme V2
http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#4_4_interface
| noir sur blanc les garanties de la bibliothèque libstdc++,
| et ensuite, on signalait une garantie supplémentaire pour la
| partie STL. Ça laissait ouvert la question : pourquoi est-ce
| qu'on n'a pas jugé utile de fournir les même garanties, mais
| au moins, ça rendait clair qu'on garantissait moins. Le
| texte aujourd'hui cite seulement les garanties SGI, puis en
| parle d'une exception ; à le lire, on dirait que la partie
| STL fournit moins de garanties que la reste.
| En tout cas, le fait reste que Posix fait un certain nombre
| de garanties en ce qui concerne les threads. Il ne définit
| pas de binding C++, ce qui laisse un peu en l'air ce qu'il
| faut faire pour être conforme en C++, mais en général, ce
| n'est pas trop difficile exterpoler (et dans au moins un cas
| où l'exterpolation n'était pas évidente, ils ont ajouté du
| commentaire pour aider). Par rapport à ce que dit Posix, g++
| a au moins deux problèmes : il n'appelle pas les
| destructeurs en cas de pthread_cancel (au
Oui mais est-ce que Posix dit qu'il faut appeler le
destructeur s'il y a un pthread_cancel ?
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
Bnone lecture avant de me dire que je réponds à une autre
question.
La réponse est que si tu penses qu'il y a un problème avec
accès en lecture (sans modification) concurrente il faut faire
un rapport de bug avec un cas de test. Nathan est en encore en
CC: de ce message et tu connais aussi son adresse.
writes:
| J'avoue que pour moi, la bibliothèque, c'était partie de g++ ;
Hmm. Jusqu'à la revolution EGCS, il était clair que la
bibliothèque de g++ étaitlivré séparemment : on installait
d'abord GCC (qui produisait CC, C++ Chill ansi que quelques
autres langages); puis on allait cherhcer libg++ qu'on
compilait en croisant les doigts. On pouvait utiliser autre
chose comme bibliothèques.
Alors, dire que cela faisait partie de g++ sans distinction me
semble un peu pousser.
Puis, EGCS est arrivé. On avait plus à aller chercher libg++
dans un coin obscure. Pour V3, j'ai pousser à une plus grande
intégration de V3 dans GCC -- en reconnaissant qu'il y avait
des arguments de ceux qui voulaient une bibliothèque
compilable avec un autre compilateur.
[...]
| > Oui mais est-ce que Posix dit qu'il faut appeler le
| > destructeur s'il y a un pthread_cancel ?
| Il ne dit pas qu'il faut -- Posix ignore le C++ dans la
| partie normative.
| Actuellement, le plus que je peux trouver, c'est la déclaration
| dans la spécification de
| pthread_cleanup_push/pthread_cleanup_pop que :
| Note that the specified cleanup handling mechanism is
| especially tied to the C language and, while the requirement
| for a uniform mechanism for expressing cleanup is
| language-independent, the mechanism used in other languages
| may be quite different. In addition, this mechanism is
| really only necessary due to the lack of a real exception
| mechanism in the C language, which would be the ideal
| solution.
| Ça suggère fort qu'un cancel doit se mapper sur une
| exception (qui évidemment appelera les destructeurs).
Oui et je suppose que tu as lu les arguments du thread que
dont j'ai donné la référence.
| On m'avait montré quelque chose où C++ était nommé
| explicitement, mais je n'arrive pas à le trouver à
| l'instant. De toute façon, il était du même genre : une
| implémentation pourrait ...
| En attendant, on est à la merci des définitions propre à
| chaque système. Sous Solaris, par exemple, pthread_cancel ne
| donne pas lieu à une exception que je saurais attraper, mais
| il appelle bien les destructeurs.
Le vrai problème ce n'est pas tellement d'appeler les
destructeurs ou non. Suppose que le système appelle les
destructeurs. Après qu'est-ce qu'il est censé faire ?
Retourner le control à l'appelant par la voie normale (retour
de fonction) ? Ou dire à l'appelant qu'il faut qu'il plie
bagage (exception) ?
Autant de questions, autant de réponses. Et avant de conclure
que les développeurs de GCC s'en fichent je prierai les gens
de lire le thread (OK c'est long, mais la question n'est pas
simple) dont je redonne le lien
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| >
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| > Bnone lecture avant de me dire que je réponds à une autre
| > question.
| Le problème n'est pas simple, je le sais. Pour un nombre de
| raisons. Et je ne classifierais pas le comportement de g++
| comme une erreur. Mais le fait est qu'en tant
| qu'utilisateur, si les destructeurs ne sont pas appelés lors
| d'un cancel, ça veut dire
Les destructeurs non appelés, c'est un symptôme d'un problème
plus fondamental. Le problème a plusieurs facettes discutées
dans le thread ci-dessus.
There has been a fair amount of discussion on the GCC mailing list
about
possibe ways of integrating POSIX threads with ISO C++.
The key question to date has been how to deal with thread
cancellation.
People have asked questions like:
* Should cancellation throw an exception?
* What happens if the exception is caught, and not rethrown?
* What happens if the exception violates an
exception-specification?
* What should be done about the fact that ISO C++ says that
C library functions like "printf" never throw exceptions?
Much of the GCC discussion can be found here:
http://gcc.gnu.org/ml/gcc/2003-12/msg00743.html
However, this issue is not specific to any compiler; it's a
general question about the interaction between C++ and
POSIX threads, and perhaps even other threading systems.
| > La réponse est que si tu penses qu'il y a un problème avec
| > accès en lecture (sans modification) concurrente il faut
| > faire un rapport de bug avec un cas de test. Nathan est en
| > encore en CC: de ce message et tu connais aussi son
| > adresse.
| D'accord. Il s'agit bien d'un cas où il n'y a pas le moindre
Je viens juste de lire ton PR.
Merci.
kanze@gabi-soft.fr writes:
| J'avoue que pour moi, la bibliothèque, c'était partie de g++ ;
Hmm. Jusqu'à la revolution EGCS, il était clair que la
bibliothèque de g++ étaitlivré séparemment : on installait
d'abord GCC (qui produisait CC, C++ Chill ansi que quelques
autres langages); puis on allait cherhcer libg++ qu'on
compilait en croisant les doigts. On pouvait utiliser autre
chose comme bibliothèques.
Alors, dire que cela faisait partie de g++ sans distinction me
semble un peu pousser.
Puis, EGCS est arrivé. On avait plus à aller chercher libg++
dans un coin obscure. Pour V3, j'ai pousser à une plus grande
intégration de V3 dans GCC -- en reconnaissant qu'il y avait
des arguments de ceux qui voulaient une bibliothèque
compilable avec un autre compilateur.
[...]
| > Oui mais est-ce que Posix dit qu'il faut appeler le
| > destructeur s'il y a un pthread_cancel ?
| Il ne dit pas qu'il faut -- Posix ignore le C++ dans la
| partie normative.
| Actuellement, le plus que je peux trouver, c'est la déclaration
| dans la spécification de
| pthread_cleanup_push/pthread_cleanup_pop que :
| Note that the specified cleanup handling mechanism is
| especially tied to the C language and, while the requirement
| for a uniform mechanism for expressing cleanup is
| language-independent, the mechanism used in other languages
| may be quite different. In addition, this mechanism is
| really only necessary due to the lack of a real exception
| mechanism in the C language, which would be the ideal
| solution.
| Ça suggère fort qu'un cancel doit se mapper sur une
| exception (qui évidemment appelera les destructeurs).
Oui et je suppose que tu as lu les arguments du thread que
dont j'ai donné la référence.
| On m'avait montré quelque chose où C++ était nommé
| explicitement, mais je n'arrive pas à le trouver à
| l'instant. De toute façon, il était du même genre : une
| implémentation pourrait ...
| En attendant, on est à la merci des définitions propre à
| chaque système. Sous Solaris, par exemple, pthread_cancel ne
| donne pas lieu à une exception que je saurais attraper, mais
| il appelle bien les destructeurs.
Le vrai problème ce n'est pas tellement d'appeler les
destructeurs ou non. Suppose que le système appelle les
destructeurs. Après qu'est-ce qu'il est censé faire ?
Retourner le control à l'appelant par la voie normale (retour
de fonction) ? Ou dire à l'appelant qu'il faut qu'il plie
bagage (exception) ?
Autant de questions, autant de réponses. Et avant de conclure
que les développeurs de GCC s'en fichent je prierai les gens
de lire le thread (OK c'est long, mais la question n'est pas
simple) dont je redonne le lien
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| >
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| > Bnone lecture avant de me dire que je réponds à une autre
| > question.
| Le problème n'est pas simple, je le sais. Pour un nombre de
| raisons. Et je ne classifierais pas le comportement de g++
| comme une erreur. Mais le fait est qu'en tant
| qu'utilisateur, si les destructeurs ne sont pas appelés lors
| d'un cancel, ça veut dire
Les destructeurs non appelés, c'est un symptôme d'un problème
plus fondamental. Le problème a plusieurs facettes discutées
dans le thread ci-dessus.
There has been a fair amount of discussion on the GCC mailing list
about
possibe ways of integrating POSIX threads with ISO C++.
The key question to date has been how to deal with thread
cancellation.
People have asked questions like:
* Should cancellation throw an exception?
* What happens if the exception is caught, and not rethrown?
* What happens if the exception violates an
exception-specification?
* What should be done about the fact that ISO C++ says that
C library functions like "printf" never throw exceptions?
Much of the GCC discussion can be found here:
http://gcc.gnu.org/ml/gcc/2003-12/msg00743.html
However, this issue is not specific to any compiler; it's a
general question about the interaction between C++ and
POSIX threads, and perhaps even other threading systems.
| > La réponse est que si tu penses qu'il y a un problème avec
| > accès en lecture (sans modification) concurrente il faut
| > faire un rapport de bug avec un cas de test. Nathan est en
| > encore en CC: de ce message et tu connais aussi son
| > adresse.
| D'accord. Il s'agit bien d'un cas où il n'y a pas le moindre
Je viens juste de lire ton PR.
Merci.
writes:
| J'avoue que pour moi, la bibliothèque, c'était partie de g++ ;
Hmm. Jusqu'à la revolution EGCS, il était clair que la
bibliothèque de g++ étaitlivré séparemment : on installait
d'abord GCC (qui produisait CC, C++ Chill ansi que quelques
autres langages); puis on allait cherhcer libg++ qu'on
compilait en croisant les doigts. On pouvait utiliser autre
chose comme bibliothèques.
Alors, dire que cela faisait partie de g++ sans distinction me
semble un peu pousser.
Puis, EGCS est arrivé. On avait plus à aller chercher libg++
dans un coin obscure. Pour V3, j'ai pousser à une plus grande
intégration de V3 dans GCC -- en reconnaissant qu'il y avait
des arguments de ceux qui voulaient une bibliothèque
compilable avec un autre compilateur.
[...]
| > Oui mais est-ce que Posix dit qu'il faut appeler le
| > destructeur s'il y a un pthread_cancel ?
| Il ne dit pas qu'il faut -- Posix ignore le C++ dans la
| partie normative.
| Actuellement, le plus que je peux trouver, c'est la déclaration
| dans la spécification de
| pthread_cleanup_push/pthread_cleanup_pop que :
| Note that the specified cleanup handling mechanism is
| especially tied to the C language and, while the requirement
| for a uniform mechanism for expressing cleanup is
| language-independent, the mechanism used in other languages
| may be quite different. In addition, this mechanism is
| really only necessary due to the lack of a real exception
| mechanism in the C language, which would be the ideal
| solution.
| Ça suggère fort qu'un cancel doit se mapper sur une
| exception (qui évidemment appelera les destructeurs).
Oui et je suppose que tu as lu les arguments du thread que
dont j'ai donné la référence.
| On m'avait montré quelque chose où C++ était nommé
| explicitement, mais je n'arrive pas à le trouver à
| l'instant. De toute façon, il était du même genre : une
| implémentation pourrait ...
| En attendant, on est à la merci des définitions propre à
| chaque système. Sous Solaris, par exemple, pthread_cancel ne
| donne pas lieu à une exception que je saurais attraper, mais
| il appelle bien les destructeurs.
Le vrai problème ce n'est pas tellement d'appeler les
destructeurs ou non. Suppose que le système appelle les
destructeurs. Après qu'est-ce qu'il est censé faire ?
Retourner le control à l'appelant par la voie normale (retour
de fonction) ? Ou dire à l'appelant qu'il faut qu'il plie
bagage (exception) ?
Autant de questions, autant de réponses. Et avant de conclure
que les développeurs de GCC s'en fichent je prierai les gens
de lire le thread (OK c'est long, mais la question n'est pas
simple) dont je redonne le lien
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| >
http://www.codesourcery.com/archives/c++-pthreads/msg00001.html
| > Bnone lecture avant de me dire que je réponds à une autre
| > question.
| Le problème n'est pas simple, je le sais. Pour un nombre de
| raisons. Et je ne classifierais pas le comportement de g++
| comme une erreur. Mais le fait est qu'en tant
| qu'utilisateur, si les destructeurs ne sont pas appelés lors
| d'un cancel, ça veut dire
Les destructeurs non appelés, c'est un symptôme d'un problème
plus fondamental. Le problème a plusieurs facettes discutées
dans le thread ci-dessus.
There has been a fair amount of discussion on the GCC mailing list
about
possibe ways of integrating POSIX threads with ISO C++.
The key question to date has been how to deal with thread
cancellation.
People have asked questions like:
* Should cancellation throw an exception?
* What happens if the exception is caught, and not rethrown?
* What happens if the exception violates an
exception-specification?
* What should be done about the fact that ISO C++ says that
C library functions like "printf" never throw exceptions?
Much of the GCC discussion can be found here:
http://gcc.gnu.org/ml/gcc/2003-12/msg00743.html
However, this issue is not specific to any compiler; it's a
general question about the interaction between C++ and
POSIX threads, and perhaps even other threading systems.
| > La réponse est que si tu penses qu'il y a un problème avec
| > accès en lecture (sans modification) concurrente il faut
| > faire un rapport de bug avec un cas de test. Nathan est en
| > encore en CC: de ce message et tu connais aussi son
| > adresse.
| D'accord. Il s'agit bien d'un cas où il n'y a pas le moindre
Je viens juste de lire ton PR.
Merci.
16. If you're going to use C++, it's likely that you need to also
install the libg++ distribution. It should be available from
the
same place where you got the GNU C distribution. Just as GNU
C
does not distribute a C runtime library, it also does not
include
a C++ run-time library. All I/O functionality, special class
libraries, etc., are available in the libg++ distribution.
Note bien l'instruction 16.
Aujourd'hui, il suffit de faire
gcc-x.y.z/configure && make && make install
et on a des compilateurs pour C, C++ + bibliothèque, ObjC, Fortran,
Java + bibliothèque.
Et les gens se plaignent :-/
16. If you're going to use C++, it's likely that you need to also
install the libg++ distribution. It should be available from
the
same place where you got the GNU C distribution. Just as GNU
C
does not distribute a C runtime library, it also does not
include
a C++ run-time library. All I/O functionality, special class
libraries, etc., are available in the libg++ distribution.
Note bien l'instruction 16.
Aujourd'hui, il suffit de faire
gcc-x.y.z/configure && make && make install
et on a des compilateurs pour C, C++ + bibliothèque, ObjC, Fortran,
Java + bibliothèque.
Et les gens se plaignent :-/
16. If you're going to use C++, it's likely that you need to also
install the libg++ distribution. It should be available from
the
same place where you got the GNU C distribution. Just as GNU
C
does not distribute a C runtime library, it also does not
include
a C++ run-time library. All I/O functionality, special class
libraries, etc., are available in the libg++ distribution.
Note bien l'instruction 16.
Aujourd'hui, il suffit de faire
gcc-x.y.z/configure && make && make install
et on a des compilateurs pour C, C++ + bibliothèque, ObjC, Fortran,
Java + bibliothèque.
Et les gens se plaignent :-/
writes:
[...]
| > Aujourd'hui, il suffit de faire
| > gcc-x.y.z/configure && make && make install
[...] | Tu exagères quand même un peu -- selon la
documentation de | l'installation, il vaut mieux générer dans
un répertoire à part.
Ah, mais si tu regardes la commande que j'ai écrite, je n'ai
pas mis
./configure
:-)
C'est un bug connu que GCC est le seul logicial de GNU qui ne
supporte pas "in source configuration".
| Et sur Linux, selon ce qu'on fait, il faut choisir telle ou
| telle option -- j'ai dû régénérer plusieurs fois parce que
| je ne le savais pas, et je l'ai appris du forum d'aide g++.
| En
mais c'est quand même moins pénible qu'il y a 8 ou 10 ans.
kanze@gabi-soft.fr writes:
[...]
| > Aujourd'hui, il suffit de faire
| > gcc-x.y.z/configure && make && make install
[...] | Tu exagères quand même un peu -- selon la
documentation de | l'installation, il vaut mieux générer dans
un répertoire à part.
Ah, mais si tu regardes la commande que j'ai écrite, je n'ai
pas mis
./configure
:-)
C'est un bug connu que GCC est le seul logicial de GNU qui ne
supporte pas "in source configuration".
| Et sur Linux, selon ce qu'on fait, il faut choisir telle ou
| telle option -- j'ai dû régénérer plusieurs fois parce que
| je ne le savais pas, et je l'ai appris du forum d'aide g++.
| En
mais c'est quand même moins pénible qu'il y a 8 ou 10 ans.
writes:
[...]
| > Aujourd'hui, il suffit de faire
| > gcc-x.y.z/configure && make && make install
[...] | Tu exagères quand même un peu -- selon la
documentation de | l'installation, il vaut mieux générer dans
un répertoire à part.
Ah, mais si tu regardes la commande que j'ai écrite, je n'ai
pas mis
./configure
:-)
C'est un bug connu que GCC est le seul logicial de GNU qui ne
supporte pas "in source configuration".
| Et sur Linux, selon ce qu'on fait, il faut choisir telle ou
| telle option -- j'ai dû régénérer plusieurs fois parce que
| je ne le savais pas, et je l'ai appris du forum d'aide g++.
| En
mais c'est quand même moins pénible qu'il y a 8 ou 10 ans.