J'ai un problème de partage de variable entre 2 threads mais je ne sais pas
comment le résoudre.
Le problème est 'simple'. Si je kill ce script, la boucle principale
s'interrompt correctement mais le thread créé ($th) ne termine pas - il voit
toujours la valeur 0 dans $mustquit. Je suppose qu'il voit une copie mémoire
mais comment contourner ce problème.
#!/usr/bin/perl
use Thread;
my $mustquit = 0;
$SIG{TERM} = \&sigquit;
my $th = new Thread(\&run);
while(! $mustquit) {
sleep(2);
}
print "Main loop quit. Waiting for thread\n";
$th->join();
exit(0);
sub sigquit() {
print "Received TERM signal\n";
lock $mustquit;
$mustquit = 1;
}
sub run() {
while(! $mustquit) {
sleep(2);
print "Flag value $mustquit\n";
}
}
[ Dans mon 'vrai' code, les sleep sont en fait des accept/recv sur
socket. J'ai beau faire un close des sockets avant le join, le thread
continue à répondre aux connections sur la socket ]
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Trognon Patrice
Yves Martin wrote:
Bonjour,
J'ai un problème de partage de variable entre 2 threads mais je ne sais pas comment le résoudre.
Le problème est 'simple'. Si je kill ce script, la boucle principale s'interrompt correctement mais le thread créé ($th) ne termine pas - il voit toujours la valeur 0 dans $mustquit. Je suppose qu'il voit une copie mémoire mais comment contourner ce problème.
J'avais rencontré bcp de problème avec la bib Thread de Perl sur un développement il y a 3 ans de cela, depuis je n'ai pas essayé a nouveau vu que j'avais fini par tout passer en multiprocess (fork) tellement le comportement des thread dans perl me semblait étrange.
Enfin quand je dis étrange, non conforme a ce que j'ai l'habitude de coder en C avec les pthreads.
C'était il y a 3 ans, mais visiblement vu ta question ...
Cordialement,
Patrice Trognon. http://www.javadevel.com
Yves Martin wrote:
Bonjour,
J'ai un problème de partage de variable entre 2 threads mais je ne sais
pas comment le résoudre.
Le problème est 'simple'. Si je kill ce script, la boucle principale
s'interrompt correctement mais le thread créé ($th) ne termine pas - il
voit toujours la valeur 0 dans $mustquit. Je suppose qu'il voit une copie
mémoire mais comment contourner ce problème.
J'avais rencontré bcp de problème avec la bib Thread de Perl sur un
développement il y a 3 ans de cela, depuis je n'ai pas essayé a nouveau
vu que j'avais fini par tout passer en multiprocess (fork) tellement
le comportement des thread dans perl me semblait étrange.
Enfin quand je dis étrange, non conforme a ce que j'ai l'habitude
de coder en C avec les pthreads.
C'était il y a 3 ans, mais visiblement vu ta question ...
J'ai un problème de partage de variable entre 2 threads mais je ne sais pas comment le résoudre.
Le problème est 'simple'. Si je kill ce script, la boucle principale s'interrompt correctement mais le thread créé ($th) ne termine pas - il voit toujours la valeur 0 dans $mustquit. Je suppose qu'il voit une copie mémoire mais comment contourner ce problème.
J'avais rencontré bcp de problème avec la bib Thread de Perl sur un développement il y a 3 ans de cela, depuis je n'ai pas essayé a nouveau vu que j'avais fini par tout passer en multiprocess (fork) tellement le comportement des thread dans perl me semblait étrange.
Enfin quand je dis étrange, non conforme a ce que j'ai l'habitude de coder en C avec les pthreads.
C'était il y a 3 ans, mais visiblement vu ta question ...
Cordialement,
Patrice Trognon. http://www.javadevel.com
Yves Martin
Yves Martin writes:
Bonjour,
J'ai un problème de partage de variable entre 2 threads mais je ne sais pas comment le résoudre.
Vive la documentation. Encore faut-il qu'elle précise de quelle version de Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples de thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces partages de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced in Perl 5.6.0 called interpreter threads, or ithreads for short. In this model each thread runs in its own Perl interpreter, and any data sharing between threads must be explicit.
Voici donc la solution à mon problème: changer d'API 'threads' et c'est tout bon.
#!/usr/bin/perl
use threads; use threads::shared;
our $mustquit : shared = 0;
$SIG{TERM} = &sigquit;
my $th = new threads(&run, $mustquit); while(! $mustquit) { sleep(2); } print "Main loop quit. Waiting for threadn"; $th->join(); exit(0);
sub sigquit() { print "Received TERM signaln"; lock $mustquit; $mustquit = 1; }
sub run($) { my $flagref = shift; while(! $$flagref) { sleep(2); print "Flag value $$flagrefn"; } }
-- Yves Martin
Yves Martin <ymartin@nospam.fr> writes:
Bonjour,
J'ai un problème de partage de variable entre 2 threads mais je ne sais pas
comment le résoudre.
Vive la documentation. Encore faut-il qu'elle précise de quelle version de
Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples de
thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces partages
de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les
premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced
in Perl 5.6.0 called interpreter threads, or ithreads for short. In
this model each thread runs in its own Perl interpreter, and any data
sharing between threads must be explicit.
Voici donc la solution à mon problème: changer d'API 'threads' et c'est tout
bon.
#!/usr/bin/perl
use threads;
use threads::shared;
our $mustquit : shared = 0;
$SIG{TERM} = &sigquit;
my $th = new threads(&run, $mustquit);
while(! $mustquit) {
sleep(2);
}
print "Main loop quit. Waiting for threadn";
$th->join();
exit(0);
sub sigquit() {
print "Received TERM signaln";
lock $mustquit;
$mustquit = 1;
}
sub run($) {
my $flagref = shift;
while(! $$flagref) {
sleep(2);
print "Flag value $$flagrefn";
}
}
J'ai un problème de partage de variable entre 2 threads mais je ne sais pas comment le résoudre.
Vive la documentation. Encore faut-il qu'elle précise de quelle version de Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples de thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces partages de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced in Perl 5.6.0 called interpreter threads, or ithreads for short. In this model each thread runs in its own Perl interpreter, and any data sharing between threads must be explicit.
Voici donc la solution à mon problème: changer d'API 'threads' et c'est tout bon.
#!/usr/bin/perl
use threads; use threads::shared;
our $mustquit : shared = 0;
$SIG{TERM} = &sigquit;
my $th = new threads(&run, $mustquit); while(! $mustquit) { sleep(2); } print "Main loop quit. Waiting for threadn"; $th->join(); exit(0);
sub sigquit() { print "Received TERM signaln"; lock $mustquit; $mustquit = 1; }
sub run($) { my $flagref = shift; while(! $$flagref) { sleep(2); print "Flag value $$flagrefn"; } }
-- Yves Martin
Paul Gaborit
À (at) Mon, 17 Jan 2005 10:13:23 +0100, Yves Martin écrivait (wrote):
Vive la documentation. Encore faut-il qu'elle précise de quelle version de Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples de thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces partages de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced in Perl 5.6.0 called interpreter threads, or ithreads for short. In this model each thread runs in its own Perl interpreter, and any data sharing between threads must be explicit.
Cette documentation existe en français si vous préférez :
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Mon, 17 Jan 2005 10:13:23 +0100,
Yves Martin <ymartin@nospam.fr> écrivait (wrote):
Vive la documentation. Encore faut-il qu'elle précise de quelle version de
Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples
de thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces
partages de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les
premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced
in Perl 5.6.0 called interpreter threads, or ithreads for short. In
this model each thread runs in its own Perl interpreter, and any data
sharing between threads must be explicit.
Cette documentation existe en français si vous préférez :
À (at) Mon, 17 Jan 2005 10:13:23 +0100, Yves Martin écrivait (wrote):
Vive la documentation. Encore faut-il qu'elle précise de quelle version de Perl elle parle. Mon livre "Perl in a nutshell" ne le dit pas. Les exemples de thread que j'ai trouvé sur le net ne fonctionnent pas à cause de ces partages de variables.
Heureusement que j'ai un LinuxMag qui me dit de lire 'man perlthrtut' et les premières lignes sont claires et nettes !!
NOTE: this tutorial describes the new Perl threading flavour introduced in Perl 5.6.0 called interpreter threads, or ithreads for short. In this model each thread runs in its own Perl interpreter, and any data sharing between threads must be explicit.
Cette documentation existe en français si vous préférez :