作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
我是一名优秀的程序员,十分优秀!