2013-06-24 71 views
0

堆在多線程環境中如何管理?多線程環境中的堆

  • 它在線程之間共享還是每個線程都有其獨立的堆?
  • 如果兩者都可能,那麼推薦的方法是哪一種?

enter image description here

+0

在什麼操作系統?什麼語言?什麼運行時環境? –

+1

檢查[this](http://stackoverflow.com/questions/1665419/do-threads-have-a-distinct-heap) –

回答

2

堆可以被互斥共享和保護。這是最簡單的解決方案,在大多數情況下運行良好。

您可以爲每個線程設置一個堆,但是您必須決定是否允許從任何線程或僅從進行分配的線程釋放釋放。無論哪種方式,它可以變得相當多毛。如果你有很多線程和大量的分配,這可以是一個更具擴展性的解決方案。

+0

+1 - 不想使用私人堆 - '多毛'?害怕! –

+0

其實私人堆不是一個壞主意。結果意味着你不能在線程之間共享內存。然後您將不得不通過顯式IPC(管道等)共享數據。然後這變得更像CSP,這是避免死鎖,活鎖等的好方法。所以不是一個壞主意...... – bazza

+0

是的,那是真的。傳統意義上的線程可以訪問彼此的數據,但是如果您刪除了這一需求,則可以使事情更加簡潔。 – Minthos

1

pthreads

man page

一個進程可以包含多個線程,所有這些都是 執行相同的程序。這些線程共享相同的全局內存 (數據和堆段),但每個線程都有自己的堆棧(自動 變量)。

堆對於所有線程都是相同的,但訪問將取決於用於訪問分配內存的變量範圍。

void* thFn(void*) 
{ 
    char* c = new char[5]; 
    //etc 
    delete[] c; 
} 

在這種情況下,內存將分配在堆上。但c是每個pthread的本地。其他pthreads可能可以從該位置讀取(如果它們被允許(如果它們以某種方式獲得地址),則檢索正確的值,直到內存由分配它的線程釋放)。