Re: Event, ithreads, and shared variables

[email protected] (Joshua N Pritikin) Wed, 21 Apr 2004 16:12:49 +0530
Newsgroups perl.loop
Message-ID <[email protected]>
On Tue, Apr 20, 2004 at 04:14:26PM -0400, hx wrote:
> hi perl-loop.  i'm attempting to use Event, ithreads, and shared
> variables together.  perl is 5.8.3, Event is 0.87.  in particular, i'd
> like to create a watcher that watches a shared variable.  sample code:
>
> #!/usr/bin/perl
> use warnings;
> use strict;
> 
> use threads;
> use threads::shared;
> 
> my $data : shared = 0; # the shared variable
> 
> #BEGIN {
>     my $writer = new threads ( sub {
>         while (1) {
>             $data++;
>             print "write: $data (ref is " . \$data . ")\n";
>             sleep (2);
>         } } );
> #} # end of BEGIN block
> 
> use Event;
> 
> Event->var (var  => \$data,
>             poll => "w",
>             cb   => sub { print "read: $data (ref is " . \$data . ")\n"; } )
>     or die "can't register variable watcher";
> 
> Event->timer ( interval => 2,
>                cb => sub { print "timer: $data (ref is " . \$data . ")\n"; } )
>     or die "can't register timer";
> 
> Event::loop ();
> 
> ... and some output:
> 
> [561] hx@hmb-laptop ~ $ ./foo.pl 
> write: 1 (ref is SCALAR(0x102b0220))
> timer: 1 (ref is SCALAR(0x1012bcf8))
> write: 2 (ref is SCALAR(0x102b0220))
> timer: 2 (ref is SCALAR(0x1012bcf8))
> write: 3 (ref is SCALAR(0x102b0220))
> timer: 3 (ref is SCALAR(0x1012bcf8))
> ...
>
> the thing to notice is that the variable watcher never triggers.  i
> guess that might make sense because the references are different.
> (that's a guess since i don't really know how var watchers are
> implemented.)

No, that's not the problem.  Those pointers probably refer to the same
variable.  The problem is that Event uses 'U' magic to subscribe to
notifications of variable reads/writes.  Unsurprisingly, 'U' magic
isn't automatically propagated through a thread-safe queue.  There is
a limit to DWIMery!

> how can one create a watcher that watches a shared variable?

Event is not designed to run in more than one thread.  Use a
thread-safe queue to communicate between the thread running Event and
other threads.

-- 
A new cognitive theory of emotion, http://openheartlogic.org
signature.asc (application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)

iD8DBQFAhlApqcqnlKSmC70RAppmAKCVB8owsy7jcmFhh8csGzYacBg6LwCfbqP7
x2FlkwOUzDif1FVn5xw+swQ=
=xQ1z
-----END PGP SIGNATURE-----