2

「mallocは同期プリミティブを提供するため、mallocはスレッドセーフであるため、mallocと同時にヒープが破損することはありません」と聞きました。

しかし、Visual Studio Crtでmalloc関数のソースコードを見ると、malloc関数がリクエストをsyscallHeapAllocに渡すだけであることがわかります。したがって、mallocではなく破損したヒープからアプリケーションを保護するために、運用システム自体が何らかの同期を提供していると思います。

では、Linuxはどうですか?malloc自体が何らかの同期を提供しますか?

4

1 に答える 1

5

これについて話す唯一の標準はC11です(以前はマルチスレッドの概念がなかったので)、それは(7.22.3 / 2)と言います:

データ競合の存在を判断するために、メモリ割り当て関数は、引数を介してアクセス可能なメモリ位置のみにアクセスし、他の静的期間ストレージにはアクセスしないかのように動作します。ただし、これらの関数は、割り当てまたは割り当て解除するストレージを視覚的に変更する場合があります。メモリの領域への呼び出し、freeまたはrealloc領域の割り当てを解除する呼び出しpは、領域のすべてまたは一部を割り当てる割り当て呼び出しと同期しますp。この同期は、割り当て解除機能によるアクセスの後p、割り当て機能によるそのようなアクセスの前に発生します。

要するに、「それはすべて大丈夫です」。

ただし、Linuxのような特定の実装は、確かに長い間(私が思うに)独自の強力な保証を提供してきており、ptmalloc2基本的には常に問題ありません。[更新、@ ArjunShankarのおかげで:Posixは確かmallocにスレッドセーフである必要があります。]

(ただし、Googleなどの他の実装tcmallocでは、マルチスレッドアプリケーションのパフォーマンスが向上する可能性があることに注意してください。)

(C ++については、C ++ 11:18.6.1.4を参照してください。)

于 2012-10-09T00:52:20.203 に答える