Perl线程和哈希键

时间:2011-09-27 17:32:25

标签: multithreading perl thread-safety

如果一个哈希在2个线程之间共享,并且我确保thread1只与key1thread2只与key2进行交互,我可以将其视为线程吗? -安全?如果是这样,我是否需要创建key1key2之前共享散列,或者每个线程可以创建自己的密钥? 有没有什么地方可以获得有关Perl哈希内部机制及其在线程中的行为的信息?

2 个答案:

答案 0 :(得分:2)

哈希是链表的数组。散列函数将密钥转换为一个数字,该数字用作存储值的数组元素(“bucket”)的索引。多个键可以散列到同一个索引(“碰撞”),因此链接列表处理这种情况。

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

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

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

你可能会发现这些有趣:

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

答案 1 :(得分:0)

是的,只要不同的线程没有跨过彼此的键,你就没事了。我对数组使用了类似的想法(例如,让每个处理线程记录它处理了多少项,以便记者线程可以每隔一秒左右添加数组中的条目并报告结果。)