in reply to Re^4: Doing two things at once, fork question. (thread + method)
in thread Doing two things at once, fork question.
My adversion to your first method is that it doesn't work:
use threads;; { package junk; sub new{bless [], $_[0] } sub method{ printf __PACKAGE__ . ": @_" } } $o = junk->new;; async{ sub{ $o->method( qw[ the quick brown fox ] ) } };; ## No output! async \&junk::method, $o, qw[ the quick brown fox ];; #outputs junk: junk=ARRAY(0x1adcdec) the quick brown fox
Likewise your second:
... setup as above async( $obj->can("method"), $obj, qw[ the quick brown fox ] );; [Type of arg 1 to threads::async must be block or sub {} (not subrouti +ne entry) at ...
Either of these do:
async sub{ $o->method( qw[ the quick brown fox ] ) };; junk: junk=ARRAY(0x1b7d5a4) the quick brown fox async{ $o->method( qw[ the quick brown fox ] ) };; junk: junk=ARRAY(0x1c1b4a4) the quick brown fox
But I'm not sure that there is any benefit to the extra level of indirection.
In particular, I'm still unsure how usable objects across threads are. They now work for (some) simple cases where they did not in the early days, but I'm still uncertain that they will work properly for all cases. If the object is closed over as in most of the cases above, things seem to function because the object is subject to cloning.
But if you want to pass an object to a thread, where the object was created after the thread was spawned, or even the class was loaded after the thread was spawned, I think you're in for some surprises.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: Doing two things at once, fork question. (thread + method)
by tye (Sage) on Mar 08, 2008 at 03:00 UTC | |
by BrowserUk (Patriarch) on Mar 08, 2008 at 10:08 UTC |