HEAP_NO_SERIALIZE标志

时间:2010-08-25 07:41:48

标签: windows heap heapalloc

  

当我在前面的代码示例中调用HeapCreate函数时,我使用了HEAP_NO_SERIALIZE标志,因为   示例代码的其余部分不是多线程安全的。

杰弗里里希特在他的书(Windows via C / C ++)中写下了这句话 但这很奇怪 如果代码不是多线程安全的,则他不必使用该标志 这是一个错误吗?或者我误解了什么?

2 个答案:

答案 0 :(得分:1)

使用HEAP_NO_SERIALIZE标志,您只需告诉Heap它将永远不会被不同的线程访问,因此根本不需要线程安全。

如果你没有指定这个标志,那么堆会在每次调用HeapXXX函数时在内部获取一个锁,所以尽管你只从一个线程访问堆,你就会有这个开销。

编辑:在这个示例中,因为它根本不是线程安全的(因此我假设不以任何方式使用线程),因此通知堆是非常有意义的,它必须不是线程安全的。< / p>

答案 1 :(得分:0)

默认情况下,Windows堆会执行其他逻辑,以确保没有两个线程同时从堆中分配内存。如何做到这一点仍然是一个秘密,但它可能是这样的:

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

但是,如果您的应用程序不使用多线程,则关键部分可能具有不可忽视的开销。要消除这种开销,您必须传递HEAP_NO_SERIALIZE标志,这将删除对临界区的调用,从而使应用程序稍快一些。