1

前のコード サンプルで HeapCreate 関数を呼び出したとき、サンプル コードの残りの部分はマルチスレッド セーフではないため、HEAP_NO_SERIALIZE フラグを使用しました。

Jeffrey Richter は彼の著書 (C/C++ 経由の Windows) でこの文を書きましたが、
それは奇妙です。
コードがマルチスレッドセーフでない場合、フラグを使用する必要はありませんでした。
バグですか?それとも私は何かを誤解していますか?

4

2 に答える 2

1

HEAP_NO_SERIALIZE フラグを使用すると、別のスレッドからアクセスされないことをヒープに伝えるだけなので、スレッドセーフはまったく必要ありません。

このフラグを指定しない場合、ヒープは HeapXXX 関数を呼び出すたびに内部的にロックを取得するため、1 つのスレッドからのみヒープにアクセスしていても、このオーバーヘッドが発生します。

編集: このサンプルでは、​​まったくスレッドセーフではないため (したがって、スレッド化をまったく使用していないと思います)、スレッドセーフであってはならないことをヒープに通知することは完全に理にかなっています。

于 2010-08-25T07:54:21.183 に答える
0

既定では、Windows ヒープは追加のロジックを実行して、2 つのスレッドが同時にヒープからメモリを割り当てないようにします。これが正確にどのように行われるかは秘密のままですが、おそらく次のようになります。

EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);

ただし、アプリケーションがマルチスレッドを使用していない場合、クリティカル セクションに無視できないオーバーヘッドが発生する可能性があります。このオーバーヘッドを取り除くには、フラグ HEAP_NO_SERIALIZE を渡す必要があります。これにより、クリティカル セクションへの呼び出しが削除され、アプリケーションがわずかに高速になります。

于 2010-08-25T07:55:24.750 に答える