2011-01-20 107 views
5

我需要分配內存,但不能使用malloc,因爲它不可重入,所以基本上我將使用POSIX mmap函數實現動態內存分配。是否可以使用mmap使用mmap分配內存

+0

「可重入」通常被理解爲包括所有葉函數,如`malloc`。 `malloc`沒有對你的代碼的回調機制,所以無論如何你都無法重新輸入它(在同一個線程中)。任何重入將完全在標準libray本身的控制之下。 – MSalters 2011-01-20 12:10:47

+0

@ MSalters:大概他想要在信號處理程序中分配內存,在這種情況下malloc()不可重入是一個問題。 – janneb 2011-01-20 12:21:58

+0

@janneb:不是不允許嗎? – MSalters 2011-01-20 21:20:55

回答

1

編輯:更換折返由線程安全

的malloc是線程安全的大多數操作系統。

你在使用哪一個,你確定它不是線程安全的? 還是你需要它是可重入的(我猜不是)?

5

是的,mmap()應該是可重入的,所以你應該可以使用它。請注意,mmap()通常是一個非常緩慢的操作,因此您可能更好地僅在那些真正需要的情況下(而非希望的情況)使用它,而不是用作通用malloc()替換。

POSIX 2008包含可從信號處理程序函數中安全調用的異步信號安全函數列表(請參閱鏈接中的第2.4.2節中的表格)。 mmap()不在該列表中,即從信號處理函數調用mmap()可能會導致未定義的行爲。

你可以做的是避免在信號處理程序中分配內存,只需設置一些標誌,稍後再做實際的工作。