Флаг HEAP_NO_SERIALIZE - PullRequest
       20

Флаг HEAP_NO_SERIALIZE

1 голос
/ 25 августа 2010

Когда я вызывал функцию HeapCreate в предыдущем примере кода, я использовал флаг HEAP_NO_SERIALIZE, потому что оставшаяся часть примера кода не является многопоточной.в своей книге (Windows через C / C ++)
Но это странно.
Если коды не являются многопоточными, ему не нужно использовать флаг.
Это ошибка?Или я что-то недопонимаю?

Ответы [ 2 ]

1 голос
/ 25 августа 2010

С флагом HEAP_NO_SERIALIZE вы просто сообщаете куче, что к ней никогда не будут обращаться разные потоки, поэтому вообще нет необходимости в безопасности потоков.

Если вы не укажете этот флаг, кучабудет внутренне получать блокировку при каждом обращении к функциям HeapXXX, поэтому вы будете иметь дополнительные издержки, хотя вы обращаетесь к куче только из одного потока.

РЕДАКТИРОВАТЬ: В этом примере, поскольку это не поток-вообще безопасен (и поэтому я предполагаю, что не использует потоки каким-либо образом), имеет смысл сообщить куче, что он не должен быть потокобезопасным.

0 голосов
/ 25 августа 2010

По умолчанию куча Windows выполняет дополнительную логику, чтобы гарантировать, что никакие два потока не выделяют память из кучи одновременно. Как именно это делается, остается секретом, но, вероятно, это будет примерно так:

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

Однако, если ваше приложение не использует многопоточность, критические разделы могут иметь небрежные накладные расходы. Чтобы устранить эти издержки, вы должны передать флаг HEAP_NO_SERIALIZE, который удалит вызовы в критическую секцию, что приведет к несколько более быстрому приложению.

...