当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

Windows-堆无序列化标志

admin 70℃

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

Jeffrey Richter在他的书(Windows通过C/C++)写的句子
但这很奇怪。
如果代码不是多线程安全的,则不必使用标志。
是虫子吗?还是我误会了什么?

有了heap_no_serialize标志,您只需告诉堆它永远不会被不同的线程访问,因此根本不需要线程安全性。

如果不指定此标志,则堆在每次调用heapxxx函数时都会在内部获取一个锁,因此尽管您只从一个线程访问堆,但仍会有此开销。

编辑:在这个示例中,由于它根本不是线程安全的(因此我假设它没有以任何方式使用线程),因此通知堆它不一定是线程安全的是非常有意义的。

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

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

但是,如果您的应用程序没有使用多线程,那么关键部分可能会有不可忽略的开销。要消除此开销,您必须传递标志heap_no_serialize,这将删除对关键部分的调用,从而使应用程序稍快。

转载请注明:我的代码 » Windows-堆无序列化标志