note
marioroy
<p>Greetings [liz],</p>
<p>A mutex is necessary whenever the Perl-like behavior, via the TIE interface, involves 2 IPC calls { FETCH and STORE }.</p>
<code>
use strict;
use warnings;
use feature 'say';
use MCE::Hobo;
use MCE::Mutex;
use MCE::Shared;
my $mutex = MCE::Mutex->new();
tie my $var, 'MCE::Shared', 0;
sub task {
for ( 1 .. 2000 ) {
$mutex->enter(sub {
$var += 1; # FETCH, STORE
$var += 4; # Ditto
});
}
}
MCE::Hobo->create(\&task) for 1 .. 4;
MCE::Hobo->waitall;
say $var; # 40000
</code>
<p>A mutex is not necessary via the OO interface. MCE::Shared::{ Array, Hash, and Scalar } include sugar methods.</p>
<code>
use strict;
use warnings;
use feature 'say';
use MCE::Hobo;
use MCE::Shared;
my $var = MCE::Shared->scalar(0);
sub task {
for ( 1 .. 2000 ) {
$var->incr;
$var->incrby(4);
}
}
MCE::Hobo->create(\&task) for 1 .. 4;
MCE::Hobo->waitall;
say $var->get; # 40000
</code>
<p>MCE::Shared works with threads and other parallel modules. Below, the same thing using threads.</p>
<code>
use strict;
use warnings;
use feature 'say';
use threads;
use MCE::Shared;
my $var = MCE::Shared->scalar(0);
sub task {
for ( 1 .. 2000 ) {
$var->incr;
$var->incrby(4);
}
}
threads->create(\&task) for 1 .. 4;
$_->join for threads->list;
say $var->get; # 40000
</code>
<p>One may also customize the shared class feasibly.</p>
<code>
use strict;
use warnings;
package My::Scalar;
use MCE::Shared::Scalar;
use base 'MCE::Shared::Scalar';
sub set_if_max {
# my ( $self, $value ) = @_;
${ $_[0] } = $_[1] if ( $_[1] > ${ $_[0] } );
1;
}
1;
package main;
use feature 'say';
use MCE::Shared;
my $var = MCE::Shared->share( { module => 'My::Scalar' }, 0 );
$var->set_if_max(42);
$var->set_if_max(11);
say $var->get; # 42
</code>
<p>Regards, Mario</p>
1215821
1216576