是否需要锁定perl中的共享变量以进行读访问?

时间:2013-03-26 11:47:00

标签: multithreading perl locking

我在perl上使用共享变量并使用threads::shared。 我们只能从单个线程修改变量,所有其他线程只是“读取”变量。

'read'线程中是否需要锁定

  {
    lock $shared_var;
    if ($shared_var > 0) .... ;
  }

没有锁定(在'阅读'线程中),简单验证是不安全的,比如

  if ($shared_var > 0) ....

2 个答案:

答案 0 :(得分:3)

设置或获取标量时,不需要锁定来保持内部完整性。

在您的特定情况下是否需要取决于读者,其他读者和作者的需求。没有锁定是很有意义的,但是你没有提供足够的细节来确定你的需求。

例如,在编写器更新共享变量后使用旧值可能是不可接受的。对于初学者来说,这可能会导致一个线程仍在使用旧值而另一个线程正在使用新值的情况,如果这两个线程相互作用,这种情况可能是不合需要的。

答案 1 :(得分:1)

这取决于在某个时间点或其他时间测试条件是否有意义。然而问题是,在绝大多数情况下,布尔测试意味着其他事情,当您完成阅读表示它代表先前状态的条件时,这些事情可能已经改变。

想一想。如果这是一个微不足道的测试,那么它意味着很少 - 你必须质疑你为什么要这样做。如果这是一个重要的测试,那么它就会显示出一个可能存在或可能不存在的连贯状态 - 你不会确定,除非你lock它。

很多时候,比如在实时报道中,你并不关心数据库给你的快照,你只需要一个相对较新的快照。但是,作为其事务逻辑的一部分,它可以全面了解事务在提交之前的状态。我认为你不太可能在代码中找到这个,当前状态是当前状态 - 甚至处于临时状态的状态也是一个确定的状态。

我猜其中一个可能不同的是队列的循环访问。如果一个消费者这次没有得到头记录,那么其中一个将在下一次出现。您可以节省一些处理时间,异步访问队列计数器。但是这里只有一次迭代意味着中很少。

在上面的例子中,您只想在之后放置一些锁定级别的指令,即使您的测试建议它有数据,也可能实际上是空的。因此,如果它只是一个初步测试,那么您必须具有将测试视为实际上不可靠的逻辑。