これについて話す唯一の標準はC11です(以前はマルチスレッドの概念がなかったので)、それは(7.22.3 / 2)と言います:
データ競合の存在を判断するために、メモリ割り当て関数は、引数を介してアクセス可能なメモリ位置のみにアクセスし、他の静的期間ストレージにはアクセスしないかのように動作します。ただし、これらの関数は、割り当てまたは割り当て解除するストレージを視覚的に変更する場合があります。メモリの領域への呼び出し、free
またはrealloc
領域の割り当てを解除する呼び出しp
は、領域のすべてまたは一部を割り当てる割り当て呼び出しと同期しますp
。この同期は、割り当て解除機能によるアクセスの後p
、割り当て機能によるそのようなアクセスの前に発生します。
要するに、「それはすべて大丈夫です」。
ただし、Linuxのような特定の実装は、確かに長い間(私が思うに)独自の強力な保証を提供してきており、ptmalloc2
基本的には常に問題ありません。[更新、@ ArjunShankarのおかげで:Posixは確かmalloc
にスレッドセーフである必要があります。]
(ただし、Googleなどの他の実装tcmalloc
では、マルチスレッドアプリケーションのパフォーマンスが向上する可能性があることに注意してください。)
(C ++については、C ++ 11:18.6.1.4を参照してください。)