3

new または malloc を使用してメモリが割り当てられる場合、アロケータは再入から自身を保護する必要がある場合があります。これを行うには2つの方法があります。

  • 大きなミューテックス。このソリューションは単純ですが、パフォーマンスが低下します
  • スレッドごとにメモリーのプールが予約されます。パフォーマンスは高いですが、プールのサイズを評価するのは難しい場合があります。

ほとんどのアロケータは 2 番目の方法を使用していると思いますが、これを証明するものは見つかりません。

どのアロケーターがどのメソッドを使用するか知っていますか? それについての基準はありますか?

4

3 に答える 3

0

C++17 では、スレッド化されたアプリケーションでアロケーターの動作を指定し始めています。

  • std::pmr::unsynchronized_pool_resourceはスレッドセーフではなく、複数のスレッドから同時にアクセスすることはできません
  • std::pmr::synchronized_pool_resourceは、外部同期なしで複数のスレッドからアクセスでき、同期コストを削減するためにスレッド固有のプールを持つ場合があります。メモリ リソースが 1 つのスレッドからのみアクセスされる場合は、unsynchronized_pool_resource の方が効率的です。
于 2016-12-01T10:41:37.683 に答える
0

すべてのマルチ スレッド プログラムの分析では、intel parallel studio(ウィンドウの下で) 常に割り当てによるロック イベントとカーネル時間を表示します。これは、VS'08 コンパイラの C++ new が主にミューテックスを使用してメモリの一貫性を維持していることを意味します。

私が開発するソフトウェアで問題が発生するたびに、RIA イディオムを使用して動的/共有メモリを削除するか、メモリをスレッド自体でのみ使用する必要がある場合は TLS アロケータを使用します。

于 2013-06-26T17:15:58.740 に答える