new
と delete
スレッドセーフです
次の関数はスレッドセーフである必要があります:
operator new
のライブラリ バージョン そしてoperator delete
- グローバル
operator new
のユーザー置換バージョン およびoperator delete
std::calloc
、std::malloc
、std::realloc
、std::aligned_alloc
、std::free
特定のストレージ ユニットを割り当てまたは割り当て解除するこれらの関数の呼び出しは、合計 1 つの順序で発生し、そのような各割り当て解除呼び出しは、この順序で次の割り当て (存在する場合) の前に発生します。
gcc では new
malloc
に委任することで実装されます 、そしてそれらの malloc
がわかりました 実際にロックを使用します。ボトルネックの原因となる割り当てが心配な場合は、独自のアロケーターを作成してください。
答えはイエスですが、実際には 通常 問題ありません。問題がある場合は、malloc の実装を tcmalloc に置き換えてみてください。競合の可能性を減らしますが、競合をなくすことはできません (スレッドとプロセス間で共有する必要があるヒープは 1 つしかないため)。
<ブロック引用>TCMalloc は、各スレッドにスレッド ローカル キャッシュを割り当てます。小さな割り当ては、スレッド ローカル キャッシュから満たされます。オブジェクトは必要に応じて中央データ構造からスレッド ローカル キャッシュに移動され、定期的なガベージ コレクションを使用してスレッド ローカル キャッシュから中央データ構造にメモリが移行されます。
カスタム アロケーターや専用コンテナーの使用、アプリケーションの再設計など、他のオプションもあります。