gpt4 book ai didi

multithreading - 如何在 perl 中创建同步方法?

转载 作者:行者123 更新时间:2023-12-04 08:26:10 25 4
gpt4 key购买 nike

在 Java 中,当我创建线程和共享对象时,有时我希望线程访问同一个对象方法,但我不希望它们同时执行此操作。因此,为避免这种情况,我将对象方法定义为 Synchronized 方法,如下所示。

同步实例方法:

类类名{ 同步类型 method_name() { \语句 block }}

方法中的所有语句都变成了同步块(synchronized block),实例对象就是锁。这意味着如果我告诉一个线程使用这个方法,它会等到前一个线程使用完这个方法。有没有办法在 Perl 中做到这一点?

最佳答案

在构造函数中创建一个互斥锁。

sub new {
...
my $mutex :shared;
$self->{mutex_ref} = \$mutex;
...
}

输入方法时锁定。

sub method {
my ($self) = @_;
lock ${ $self->{mutex_ref} };
...
}

演示:

use strict;
use warnings;
use threads;
use threads::shared;
use feature qw( say );

sub new {
my ($class, $id) = @_;
my $mutex :shared;
return bless({
mutex_ref => \$mutex,
id => $id,
}, $class);
}

sub method {
my ($self) = @_;
lock ${ $self->{mutex_ref} };
say sprintf "%08X %s %s", threads->tid, $self->{id}, "start";
sleep(2);
say sprintf "%08X %s %s", threads->tid, $self->{id}, "end";
}

my $o1 = __PACKAGE__->new('o1');
my $o2 = __PACKAGE__->new('o2');

for (1..3) {
async { my ($o) = @_; $o->method() } $o1;
async { my ($o) = @_; $o->method() } $o2;
}

$_->join for threads->list();
  • 没有两个对 $o1->method 的调用同时运行。
  • $o1->method$o2->method 的调用可以同时运行。

实际上,如果您要共享对象——这是通过将对象作为参数传递给上述代码中的 async 来完成的——你可以使用对象本身作为锁。

use threads::shared qw( shared_clone );

sub new {
my ($class, ...) = @_;
return shared_clone(bless({
...
}, $class));
}

输入方法时锁定。

sub method {
my ($self) = @_;
lock %$self;
...
}

关于multithreading - 如何在 perl 中创建同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com