2

を使用するマルチスレッドアプリケーションがありますboost::thread。パフォーマンス上の理由から、各スレッドに独立したヒープを持たせたいと思います。

を使用してヒープを作成できますが、HeapCreate()これをCRTライブラリに接続して、作成されたヒープにメモリnewmalloc割り当てる方法がわかりません。これはどのように行うことができますか?

4

4 に答える 4

3

これはどのように行うことができますか?

メモリアロケータ全体を完全に交換せずに行うことはできません。たとえば、スケーラブルメモリマネージャのHoardはまさにそれを実行します。しかし、メモリアロケータを交換することは気弱な人のためではありません。

でスレッドごとのヒープを使用する必要がHeapCreateあり、割り当て/割り当て解除コードが適切に含まれている場合は、スレッドコードHeapAllocHeapFree明示的に呼び出すだけで済みます。ただし、これが標準のCRTアロケータと同じくらい高速で、パフォーマンスが優れているとしたら、私は驚きます。

于 2012-09-25T12:33:41.040 に答える
2

「グローバル演算子new」を提供できます。これを使用して、現在のスレッドを確認し、適切なヒープからメモリを返すことができます。もちろん、独自の「グローバル削除」も提供する必要があります。

もちろん、これはnewとdeleteが実際に使用される「キャッチ」ケースのみになります:-)

于 2012-09-25T12:34:42.860 に答える
2

残念ながら、CRTヒープを置き換えるための安全で文書化された方法はありません。ハックのみ。

new/ステートメントの場合、グローバルをdelete提供できます。これにより、現在のスレッドに応じて、必要なヒープにメモリが割り当て/割り当て解除されます。スレッドローカルストレージ(TLS)は通常、スレッドローカルヒープハンドルを格納するために使用されます。operator new()operator delete()

malloc/の場合、そのfreeような文書化された置き換え方法はありません。ここでは、ほとんどのハックについて説明します

于 2012-09-25T12:34:28.007 に答える
0

別のアプローチ:名前以外はすべて同一の複数のDLLを使用します。スレッドごとに異なるDLLをロードします。

于 2012-09-25T15:26:05.577 に答える