OVH Cloud OVH Cloud

MultiThreading & partage de variable

3 réponses
Avatar
Yves Martin
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.

#!/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 ]

Merci d'avance pour votre aide
--
Yves Martin

3 réponses

Avatar
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

Avatar
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

Avatar
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 :

<http://www.enstimac.fr/Perl/DocFr/perlthrtut.html>

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>