2011-09-27 107 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