Salut a tous, j'ai un programme perl qui utilise des threads et ces threads essaie accède a un fichier dbm dans lequel je stocke des hachages , j'avais un problème d'accès concurentiel j'ai donc décidé de reprendre la lib Thread::Queue mais lié avec un dbmet pas un tableau. Mon problème c'est que seulement une partie de mon code marche
![]()
Voila le code en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package DBM; use threads::shared; use strict; use Fcntl; use MLDBM qw(DB_File Storable); sub new { my $class = shift; tie my %dbm, 'MLDBM' ,'Document.dbm', O_CREAT|O_RDWR or die $!; share(%dbm); return bless \%dbm, $class; } sub dequeue { my $q = shift; lock(%$q); cond_wait %$q until %$q; cond_signal %$q if scalar keys %$q > 1; if ( my ($c, $v) = each(%$q) ) { return $v; } } sub enqueue { my $q = shift; my $value = shift; lock(%$q); $q->{$value->{'url'}} = $value and cond_signal %$q; } sub pending { my $q = shift; lock(%$q); return scalar keys %$q; } 1;
Quand je fait un pending le script me renvie bien 0 sans planter, mais quand je fait un enqueue la perl me plante en disant :
la ligne en question est celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Uncaught exception from user code: Invalid value for shared scalar at C:\DOCUME~1\Siaoly\Bureau\/DBM.pm line 35. at C:\DOCUME~1\Siaoly\Bureau\/DBM.pm line 35 DBM::enqueue('DBM=HASH(0x18fbb38)', 'HASH(0x1b73c3c)') called at C:\DOCUME~1\Siaoly\Bureau\0.pl line 14
Code : Sélectionner tout - Visualiser dans une fenêtre à part $q->{$value->{'url'}} = $value and cond_signal %$q;
pour tester mon code j'ai utilise ce petit script sans threads pour l'instant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #!/usr/bin/perl -w use strict; use diagnostics; use threads; use DBM; my $Queue = DBM->new; $Queue->enqueue( { url => 'maison', teste => 2 } );
Merci
Partager