前のコード サンプルで HeapCreate 関数を呼び出したとき、サンプル コードの残りの部分はマルチスレッド セーフではないため、HEAP_NO_SERIALIZE フラグを使用しました。
Jeffrey Richter は彼の著書 (C/C++ 経由の Windows) でこの文を書きましたが、
それは奇妙です。
コードがマルチスレッドセーフでない場合、フラグを使用する必要はありませんでした。
バグですか?それとも私は何かを誤解していますか?
前のコード サンプルで HeapCreate 関数を呼び出したとき、サンプル コードの残りの部分はマルチスレッド セーフではないため、HEAP_NO_SERIALIZE フラグを使用しました。
Jeffrey Richter は彼の著書 (C/C++ 経由の Windows) でこの文を書きましたが、
それは奇妙です。
コードがマルチスレッドセーフでない場合、フラグを使用する必要はありませんでした。
バグですか?それとも私は何かを誤解していますか?
HEAP_NO_SERIALIZE フラグを使用すると、別のスレッドからアクセスされないことをヒープに伝えるだけなので、スレッドセーフはまったく必要ありません。
このフラグを指定しない場合、ヒープは HeapXXX 関数を呼び出すたびに内部的にロックを取得するため、1 つのスレッドからのみヒープにアクセスしていても、このオーバーヘッドが発生します。
編集: このサンプルでは、まったくスレッドセーフではないため (したがって、スレッド化をまったく使用していないと思います)、スレッドセーフであってはならないことをヒープに通知することは完全に理にかなっています。
既定では、Windows ヒープは追加のロジックを実行して、2 つのスレッドが同時にヒープからメモリを割り当てないようにします。これが正確にどのように行われるかは秘密のままですが、おそらく次のようになります。
EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);
ただし、アプリケーションがマルチスレッドを使用していない場合、クリティカル セクションに無視できないオーバーヘッドが発生する可能性があります。このオーバーヘッドを取り除くには、フラグ HEAP_NO_SERIALIZE を渡す必要があります。これにより、クリティカル セクションへの呼び出しが削除され、アプリケーションがわずかに高速になります。