【问题标题】:Perl threads and hash keysPerl 线程和哈希键
【发布时间】:2011-09-28 08:27:57
【问题描述】:

如果在 2 个线程之间共享一个哈希,并且如果我确保 thread1 仅与 key1thread2 仅与 key2 交互,我可以假设它是线程安全的吗?如果是这样,我是否需要创建key1key2,然后才能在踏板上共享散列,或者每个线程可以创建自己的密钥? 有没有什么地方可以获取有关 Perl 哈希内部机制及其线程行为的一些信息?

【问题讨论】:

    标签: multithreading perl thread-safety


    【解决方案1】:

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

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

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

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

    你可能会觉得这些很有趣:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哈希的内部结构应该比数组复杂一点。如果您在开始时确保每个数组的大小固定,我不会期望单独操作每个索引会出现问题,但是如果两个或多个线程需要在“完全相同的时间”扩展数组以适应新大小,确实Perl 会处理这个线程安全问题吗?
      • 是的,我有一个预先指定的线程数 ($num_threads),并且——在启动我的线程之前——用零填充长度为 $num_threads 的共享数组。然后,我将一个参数传递给每个处理线程,该参数是一个从 0 到 $num_threads - 1 的(不同的)数字。
      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2011-10-27
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多