Perl 线程和哈希键

发布于 2024-12-06 12:53:16 字数 263 浏览 0 评论 0原文

如果 a 在 2 个线程之间共享哈希,并且如果我确保 thread1 仅与 key1 交互,而 thread2 仅与 key2 交互code>,我可以假设它是线程安全的吗?如果是这样,我是否需要在通过步骤共享哈希之前创建 key1key2 或者每个线程可以创建自己的密钥? 有没有什么地方可以获取有关 Perl 哈希内部机制及其线程行为的信息?

If a have a hash shared between 2 threads and if I ensure that thread1 just interacts with key1 and thread2 just with key2, can I assume it as thread-safe? If so, do I need to create key1 and key2 before share the hash over the treads or can each thread create its own key?
Is there any place where I can get some information about Perl hashes internal mechanisms and its behavior with threads?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愚人国度 2024-12-13 12:53:16

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

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

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

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

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

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

A hash is an array of linked lists. A hashing function converts the key into a number which is used as the index of the array element ("bucket") into which to store the value. More than one key can hash to the same index ("collision"), so the linked lists handle this case.

If a thread modifies one of the linked lists (e.g. to add an element) while another is navigating it (e.g. to fetch an element), It could lead to problems.

As such, adding elements is not safe. You could address this by precreating the elements of the hash (or array).

So that leaves the question of whether accessing existing elements is safe or not. It might be, but there is no guarantee of that.

You might find these interesting:

  • illguts goes into internal details of Perl data structures.
  • Devel::Peek is a very useful tool.
ぽ尐不点ル 2024-12-13 12:53:16

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

Yes, as long as different threads don't step over each other's keys, you're fine. I use a similar idea with arrays (eg having each processing thread record how many items it has processed so that a reporter thread can add up the entries from the array every second or so and report the result).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文