http://qs321.pair.com?node_id=394885

philou has asked for the wisdom of the Perl Monks concerning the following question:

Hi all, I've got a bit of trouble with perl threads. What I'm trying to do is to share a Thread::Semaphore object among multiple threads ( actually I would like to embed a Thread::Semaphore within an object ). The straigthforwad approach does not work :
#!/home/philou/install/perl-5.8.2-threads/bin/perl -w use strict; use threads; use threads::shared; use Thread::Semaphore; my $s = 'Thread::Semaphore'->new( 1 ); sub t { while( $s->down() ) { print "DOWN!\n"; sleep( 1 ); } } 'threads'->new( \&t ); while( <> ) { $s->up(); print "UP!\n"; }
That is, each time I press the `Enter' key, I would expect a "DOWN!" to show up on my terminal ( if the semaphore was shared ), but nothing happens.

Declaring the `$s' variable as `shared' does not help at all :

#!/home/philou/install/perl-5.8.2-threads/bin/perl -w use strict; use threads; use threads::shared; use Thread::Semaphore; my $s : shared = 'Thread::Semaphore'->new( 1 ); sub t { while( $s->down() ) { print "DOWN!\n"; sleep( 1 ); } } 'threads'->new( \&t ); while( <> ) { $s->up(); print "UP!\n"; }
When excuting the previous piece of code, it seems that the sharedness of `$s' prevents it from being a blessed object, and I end up with :
thread failed to start: Can't call method "down" on unblessed referenc +e at ./t.pl line 11.
So my question is: How do you share Thread::Semaphore among perl threads ?

Any suggestion appreciated.

Philou