質問:「malloc は再入可能です」?
答え:いいえ、違います。ルーチンを再入可能にする理由の 1 つの定義を次に示します。
一般的なバージョンの malloc では、(シグナル ハンドラなどから) 再入力することはできません。再入可能ルーチンはロックを使用しない可能性があり、存在するほとんどすべての malloc バージョンはロック (スレッドセーフにする) またはグローバル/静的変数 (スレッドセーフでない and にする) を使用することに注意してください。 再入不可)
これまでのすべての回答は、「malloc はスレッドセーフですか?」という回答であり、これはまったく別の質問です。 それに 質問の答えは場合による ランタイム ライブラリ、および場合によっては使用するコンパイラ フラグについて。最近の UNIX では、デフォルトでスレッドセーフな malloc を取得します。 Windows では、/MT
を使用します 、 /MTd
、 /MD
または /MDd
スレッドセーフなランタイム ライブラリを取得するためのフラグ。
-pthread でコンパイルすると、malloc がスレッドセーフになるとどこかで読みました。ただし、malloc は ANSI C であり、スレッドはそうではないため、実装に依存していると確信しています。
gcc の場合:
http://groups.google.com/group/comp.lang.c.moderated/browse_thread/thread/2431a99b9bdcef11/ea800579e40f7fa4
別の意見、より洞察力
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2005-07/0323.html
これはかなり古い質問であり、現在の状況に応じて新鮮さをもたらしたい.
はい、現在 malloc()
スレッドセーフです。
glibc-2.20 [released 2014-09-07]
の GNU C ライブラリ リファレンス マニュアルから :