in reply to Re^3: Passing self to process as reference
in thread Passing self to process as reference

Thanks. The problem is that I wish to pass by reference. for example -
my @paramters = $self; my $thread = new Thread \&processJobs, @paramters; $self->{name} = "new name"; return $self; } sub processJobs { my $self = shift; while(1) { print "Processing Jobs for Server Name: ", $self->{name},"\n"; } }
Will never print "new name". How do I pass self by reference? Thanks.

Replies are listed 'Best First'.
Re^5: Passing self to process as reference
by ELISHEVA (Prior) on Mar 18, 2009 at 11:58 UTC

    "New name" never printing has nothing to do with passing by reference ($self is already reference to the object) and everything to do with how threads work. For more information on this topic by a monk with a similar problem, please see Shared variable not changing?.

    Just to reinforce the point that the blessed object reference (what is stored in $self) can be used to reset the name when threading doesn't get in the way, consider this example using a closure:

    { package Foo; sub new { my $sClass = shift; my $self= { name => shift }; return bless($self, $sClass); } sub printName { my $self = shift; print $self->{name} . "\n"; }; } my $oFoo = Foo->new(q{George Alan O'Dowd}); my $crPrintCurrentName = sub { $oFoo->printName(); }; &$crPrintCurrentName(); $oFoo->{name} = 'Boy George'; &$crPrintCurrentName();

    prints

    George Alan O'Dowd Boy George

    Best, beth

Re^5: Passing self to process as reference
by Anonymous Monk on Mar 18, 2009 at 11:48 UTC
    Heres my code now -
    #!/usr/bin/perl use strict; use warnings; use MyStuff::Server; my $serverPort = '17077'; my %serverDictionary; $serverDictionary{"barry"} = new MyStuff::Server("barry","localhost",1 +7070); sleep(10); # and my package - # Represents a video server package MyStuff::Server; use strict; use warnings; use Thread; sub new { my $class = shift; my $self = { name => shift, }; bless $self, $class; my @paramters = $self; my $thread = new Thread \&processJobs, \@paramters; print "SELF: ", $self,"\n"; $self->{name} = "new name"; return $self; } sub processJobs { my $paramters = shift; my $self = @$paramters[0]; print "SELF: ", $self,"\n"; sleep(5); print $self->{name}, "\n"; }
    this outputs -
    SELF: MyStuff::Server=HASH(0x8153c28)
    SELF: MyStuff::Server=HASH(0x8358760)

    and then lots of barry... but never "new name". So, I'm not passing self by reference. How can I do this? Thanks!