2011-09-27 110 views
3

如果有一个哈希2个线程之间,如果我保证thread1只是key1thread2只是key2互动,我可以假设它是线程安全的共享?如果是这样,我需要创建key1key2之前分享散列或每个线程可以创建自己的密钥? 有没有什么地方可以获得关于Perl哈希内部机制以及线程行为的一些信息?Perl的线程和哈希键

回答

2

散列是一个链接列表数组。散列函数将该键转换为一个数字,该数字用作存储该值的数组元素(“存储区”)的索引。多个键可以散列到相同的索引(“冲突”),所以链表处理这种情况。

如果一个线程修改其中一个链接列表(例如添加一个元素)而另一个链接列表正在导航(例如,获取元素),则可能会导致问题。

因此,添加元素并不安全。您可以通过预先创建哈希(或数组)的元素来解决这个问题。

这样就留下了访问现有元素是否安全的问题。它可能是,但不能保证。

您可能会发现这些有趣的:

  • illguts进入Perl数据结构的内部细节。
  • Devel::Peek是一个非常有用的工具。
0

是的,只要不同的线程不跨越对方的键,你很好。我对数组使用了一个类似的想法(例如让每个处理线程记录它处理了多少个项目,以便记者线程可以每秒钟从数组中增加条目并报告结果)。

+0

哈希的内部结构应该比数组复杂一点。如果你确保每个数组开始一个固定的大小,我不会期望每个索引的个别操作出现问题,但是如果两个或多个线程需要在“完全相同的时间”内扩展数组以适应新大小, Perl处理这个线程安全问题? – cirne100

+0

是的,我有一个预先指定数量的线程('$ num_threads'),并且 - 在开始我的线程之前 - 用零填充长度为$ num_threads的共享数组。然后,我将一个参数传递给每个处理线程,该线程是从0到'$ num_threads - 1'的一个(不同的)数字。 – 2011-09-27 19:23:46