在前面的代码示例中调用HeapCreate函数时,使用了HEAP_NO_SERIALIZE标志,因为示例代码的其余部分并不是多线程安全的。
Jeffrey在他的书中写了这个句子(Windows通过C/C++)
但这很奇怪。
如果代码不是多线程安全的,他就不必使用这个标志。
是虫子吗?还是我误会了什么?
发布于 2010-08-25 07:54:21
使用HEAP_NO_SERIALIZE标志,您只需告诉堆,不同线程永远不会访问它,因此根本不需要线程安全性。
如果您不指定此标志,堆将在每次调用HeapXXX函数时在内部获取一个锁,因此,尽管您只从一个线程访问堆,但您将有此开销。
编辑:在这个示例中,由于它根本不是线程安全的(因此我假设它没有以任何方式使用线程),因此通知堆,它不应该是线程安全,这是非常有意义的。
发布于 2010-08-25 07:55:24
默认情况下,Windows堆执行额外的逻辑,以确保没有两个线程同时从堆中分配内存。如何做到这一点仍然是个秘密,但很可能是这样的:
EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);但是,如果您的应用程序没有使用多线程,关键部分可能有不可忽略的开销。要消除这种开销,您必须传递标志HEAP_NO_SERIALIZE,它将删除对关键部分的调用,从而使应用程序稍微快一些。
https://stackoverflow.com/questions/3563797
复制相似问题