GNU/Linux >> Linux の 問題 >  >> Linux

ヒープへのアクセスはシリアル化されていますか?

newdelete スレッドセーフです

<ブロック引用>

次の関数はスレッドセーフである必要があります:

  • operator new のライブラリ バージョン そして operator delete
  • グローバル operator new のユーザー置換バージョン および operator delete
  • std::callocstd::mallocstd::reallocstd::aligned_allocstd::free

特定のストレージ ユニットを割り当てまたは割り当て解除するこれらの関数の呼び出しは、合計 1 つの順序で発生し、そのような各割り当て解除呼び出しは、この順序で次の割り当て (存在する場合) の前に発生します。

gcc では new malloc に委任することで実装されます 、そしてそれらの malloc がわかりました 実際にロックを使用します。ボトルネックの原因となる割り当てが心配な場合は、独自のアロケーターを作成してください。


答えはイエスですが、実際には 通常 問題ありません。問題がある場合は、malloc の実装を tcmalloc に置き換えてみてください。競合の可能性を減らしますが、競合をなくすことはできません (スレッドとプロセス間で共有する必要があるヒープは 1 つしかないため)。

<ブロック引用>

TCMalloc は、各スレッドにスレッド ローカル キャッシュを割り当てます。小さな割り当ては、スレッド ローカル キャッシュから満たされます。オブジェクトは必要に応じて中央データ構造からスレッド ローカル キャッシュに移動され、定期的なガベージ コレクションを使用してスレッド ローカル キャッシュから中央データ構造にメモリが移行されます。

カスタム アロケーターや専用コンテナーの使用、アプリケーションの再設計など、他のオプションもあります。


Linux
  1. Vimで特定のヘルプファイルにアクセスする正しい方法は?

  2. Iptablesを削除するとネットワークアクセスが「中断」されたのはなぜですか?

  3. パスを見つけるために readlink を実装する方法

  1. サブディレクトリにアクセスするとき、親ディレクトリの権限は重要ですか?

  2. Unixでその場で履歴にアクセスする方法は?

  3. コマンドラインから Unix ドメインソケットにアクセスする方法は?

  1. コメントされたコマンドの最後の引数にアクセスする方法は?

  2. cPanelでウェブメールインターフェースにアクセスする方法

  3. コントロールパネルにアクセスするにはどうすればよいですか?