2015-12-09 58 views
-1

我有以下幾點:預分配 - 同樣的結構

typedef struct _wrapper { 
    int num; 
    foo *bar; 
    pthread_mutext_t lock; 
    struct _wrapper *prev; 
    struct _wrapper *next; 
} wrapper; 

您可以大概已經知道在那裏我有這個打算:我想加載,提前,多個包裝在運行時每次我需要一個包裝器時保存必須使用malloc調用。我將使用try_lock循環查找可用的包裝器,並且在遍歷所有可用包裝器並找不到任何可用包裝器後,再次使用malloc()再分配一些,並將它們添加到包裝器的鏈接列表中。

我可以用適當建立它的循環中執行單獨的malloc()調用和構建鏈表這樣的,簡單修改*未來和*分組在每個循環週期。我試圖找出的是,如果有一種方法實質上創建它們在一個單一的malloc()語句(即(包裝*)malloc(sizeof(包裝)* 50));我的問題是 - 我怎麼去建設所有這些包裝,並把它們放在正確的位置在記憶中,以確保我不踩在其他(S)的頂部?一個很好的方向推動將不勝感激

+0

我喜歡某人投票的方式......誰做了這件事,一定不會像孩子一樣得到很多愛。 –

回答

0

如果你使一個單獨的malloc用於50個包裝器,你將要創建的是一個包裝器數組,分配在動態內存中。

要獲得第i個包裝器的地址,必須將(i * sizeof(wrapper))添加到malloc返回的指針中。使用此地址,您可以爲50個封裝器中的每一個填充指針* prev和* next。

但是,雖然可能,但我不會建議它出於以下原因。

  1. 它不會產生乾淨的代碼。
  2. 添加其他元素必須單獨處理
  3. 免費將是簡單,如果列表中沒有增長,但如果該列表的增長過去會有不同的情況下,50
+0

因此,有人說,單獨爲每個包裝器分配malloc(),然後在每次迭代中分配next和prev,然後根據需要釋放每個包裝器會更好嗎?而且,當單獨使用50個包裝器與一次重大打包時,它的開銷是多少(並非像這樣的情況下,我認爲這很重要)?這會影響內存是否連續? –

+0

如上所述,單獨使用malloc會更好。開銷不應該太大,但這取決於你的系統。內存不會連續。這不是必需的,因爲你有指向下一個和前一個可用位置的指針。 –

+0

我同意這個要求不存在 - 但是不會因爲內存不連續而導致性能降低一點?還是說退化真的不足以讓人擔心? 我越想到它,最好是在空間可擴展的情況下執行單個malloc(),並且意圖將它們釋放回到50,如果它們的需求減少。如果我最終放棄了第一個,那麼我會感覺這將導致從原來的malloc中免費獲得50個... 我很欣賞這些輸入,夥計們。我會堅持個人malloc()的每個。 –

1
  1. 你可以分配的50個包裝與malloc(50*sizeof wrapper)

  2. 數組他們將作爲p[0]訪問,... p[49]如果你的malloc的結果存儲到包裝* p,你也可以使用p,... p+49當需要指針(如處理您的鏈接列表時)

  3. 這可能複雜化的額外分配和釋​​放,如果你不能爲整個組做一次,但這種類型的內存池是加快分配的常用方法。

  4. 不要忘記,你必須初始化互斥鎖,分配將是不夠的。

+0

非常感謝......我只是意識到一件可怕的事情。目的是使用try mutex循環遍歷包裝器列表,直到找到可用的,並在20ish池中按需分配更多,然後在負載減少時釋放它們...但是,我現在意識到的是如果我使用互斥鎖來做這件事,我會遇到一個解決互斥鎖的問題。一個線程將作業創建發送給調度器,並提交它。工作者線程將是搶佔包裝的人,使用它,然後嘗試釋放它。一個線程可以釋放它沒有創建的互斥鎖嗎? –

+0

你的意思是銷燬還是解鎖?一個線程解鎖一個互斥體,如果UB IIRC沒有鎖定它。銷燬不應該是一個問題,但我會注意不要破壞線程鎖定的互斥鎖。 – AProgrammer

+0

Got ya ...在那個筆記上,好像我將不得不分配一些工作線程來處理通過包裝器的翻找,然後使用它們從另一個線程發出信號,以便讓原始線程鎖定互斥鎖解開它...謝謝你的意見,非常感謝。 :) –