Флаг HEAP_NO_SERIALIZE
Когда я вызывал функцию HeapCreate в предыдущем примере кода, я использовал флаг HEAP_NO_SERIALIZE, потому что оставшаяся часть примера кода не является многопоточной.
Джеффри Рихтер написал предложение в своей книге (Windows через C/C++)
Но это странно.
Если коды не являются многопоточными, ему не нужно использовать флаг.
Это ошибка? Или я что-то недопонимаю?
2 ответа
С флагом HEAP_NO_SERIALIZE вы просто сообщаете Heap, что к нему никогда не будут обращаться разные потоки, поэтому вообще нет необходимости в безопасности потоков.
Если вы не укажете этот флаг, куча будет внутренне получать блокировку при каждом вызове функций HeapXXX, так что вы будете иметь дополнительные издержки, хотя вы обращаетесь к куче только из одного потока.
РЕДАКТИРОВАТЬ: В этом примере, поскольку он вообще не является потокобезопасным (и поэтому я предполагаю, что не использует потоки каким-либо образом), имеет смысл сообщить куче, что она не должна быть поточно-безопасной.
По умолчанию куча Windows выполняет дополнительную логику, чтобы убедиться, что никакие два потока не выделяют память из кучи одновременно. Как именно это делается, остается секретом, но, вероятно, это будет примерно так:
EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);
Однако, если ваше приложение не использует многопоточность, критические разделы могут иметь небрежные накладные расходы. Чтобы устранить эти издержки, вы должны передать флаг HEAP_NO_SERIALIZE, который удалит вызовы в критическую секцию, что приведет к несколько более быстрому применению приложения.