首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HEAP_NO_SERIALIZE标志

HEAP_NO_SERIALIZE标志
EN

Stack Overflow用户
提问于 2010-08-25 07:41:47
回答 2查看 1.6K关注 0票数 1

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

Jeffrey在他的书中写了这个句子(Windows通过C/C++)

但这很奇怪。

如果代码不是多线程安全的,他就不必使用这个标志。

是虫子吗?还是我误会了什么?

EN

回答 2

Stack Overflow用户

发布于 2010-08-25 07:54:21

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-08-25 07:55:24

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

代码语言:javascript
复制
EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3563797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档