如果一个哈希在2个线程之间共享,并且我确保thread1
只与key1
和thread2
只与key2
进行交互,我可以将其视为线程吗? -安全?如果是这样,我是否需要创建key1
和key2
之前共享散列,或者每个线程可以创建自己的密钥?
有没有什么地方可以获得有关Perl哈希内部机制及其在线程中的行为的信息?
答案 0 :(得分:2)
哈希是链表的数组。散列函数将密钥转换为一个数字,该数字用作存储值的数组元素(“bucket”)的索引。多个键可以散列到同一个索引(“碰撞”),因此链接列表处理这种情况。
如果一个线程修改了一个链接列表(例如添加一个元素)而另一个链接列表正在导航它(例如,要获取一个元素),它可能会导致问题。
因此,添加元素并不安全。您可以通过预先创建哈希(或数组)的元素来解决这个问题。
这就留下了访问现有元素是否安全的问题。它可能是,但不能保证。
你可能会发现这些有趣:
答案 1 :(得分:0)
是的,只要不同的线程没有跨过彼此的键,你就没事了。我对数组使用了类似的想法(例如,让每个处理线程记录它处理了多少项,以便记者线程可以每隔一秒左右添加数组中的条目并报告结果。)