首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl共享变量原子性和可见性

Perl共享变量原子性和可见性
EN

Stack Overflow用户
提问于 2014-10-06 11:35:17
回答 1查看 357关注 0票数 6

这是我从threads::shared描述中读到的:

默认情况下,变量对每个线程都是私有的,每个新创建的线程都获得每个现有变量的私有副本。此模块允许您在不同线程之间共享变量. (更多)

假设有一个共享变量,如下所示:

代码语言:javascript
复制
my $var :shared;
$var = 10;

这意味着对于我创建的所有线程,变量只存在一次。

关于原子性和可见性:

如果thread_A分配了一个新的值,比如11:

代码语言:javascript
复制
$var = 11;

它是否保证thread_B (以及我可能创建的所有其他线程)将看到值11?任务是原子地执行的吗?

或者,我们是否像Java中的那样,先获得一个锁,然后执行赋值,然后释放锁。并且只有使用相同锁的线程才能看到更新的值?

还是像Java中的易失性原语变量一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-06 11:41:05

在更新中强制执行原子性始终是一个很好的实践。Perl提供了lock来允许我们这样做。您可以lock变量本身-如果变量与线程共享,那么锁状态也是如此。

如果您更新$var,那么其他线程将看到新的值。

但你确实有一个潜在的种族条件,取决于他们何时访问它。如果这是个问题- lock,如果不是.继续吧。

请记住,像$var++这样的操作不一定是原子的。(http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26215371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档