2017-06-14 40 views
2

是一個線程動態分配內存嗎?線程創建 - 是否動態分配?

我一直在研究並對線程有一個公正的理解以及如何使用它們。我專門查看了線程的POSIX API。

我想了解線程創建以及它如何與簡單的malloc調用不同。

我知道線程與父進程共享某些內存段,但它擁有自己的堆棧。

任何資源,我可以通過這個主題閱讀讚賞。謝謝!

+0

你可以看到[this](https://gist.github.com/jbwyme/9479813)關於pthread本地存儲。 pthread運行函數作爲線程,因此每個線程都有自己的堆棧。 –

+0

線程不僅僅是內存。通常,一個線程與操作系統數據相關聯(如果它與OS任務相關聯)。一個線程可以被連接(產生它的返回值)。線程可以被髮送或取消。 – EOF

+0

我不反對任何事情。我有點好奇,如果一個malloc用於線程創建等。 –

回答

0

線程創建和malloc()調用是完全不同的概念。一個malloc()調用從堆中動態地分配請求的字節內存塊以供程序使用。

而線程可以被視爲「輕量級進程」。線程是進程內的實體,每個進程至少有一個線程來幫助完成執行。進程的線程將共享進程虛擬地址和進程的所有資源。當您創建一個進程的新線程時,這些新線程將擁有自己的用戶堆棧,它們將被獨立調度以供調度程序執行。同樣爲了線程同時運行,它們將具有它們的上下文,其將在搶佔之前存儲線程的狀態,即所有寄存器的狀態。

0

是一個線程動態分配內存?

不,沒什麼。線程具有與它們唯一相關的內存 - 至少是一個堆棧 - 但這樣的內存不是線程本身。

我想了解線程創建以及它如何與簡單的malloc調用不同。

作爲內存分配的東西的新線程創建甚至不是種類。這兩者根本沒有可比性。

具有直接操作系統支持的線程實現(並非所有的操作)都不可能依賴C庫來爲其堆棧,內核數據結構或任何其他線程實現相關數據獲取內存。另一方面,那些沒有OS支持的程序,比如Linux的舊「綠色」線程,更可能通過C庫分配內存。即使沒有直接操作系統支持的線程實現,也可以使用系統調用來獲取他們所需的內存,就像malloc()本身必須執行的那樣。無論如何,獲得的內存本身並不是線程。

還要注意,支持和不支持OS的線程系統之間的區別與線程API是正交的。例如,Linux的綠色線程和現在無處不在的內核支持的NPTL線程都實現了POSIX線程API。