HEAP_NO_SERIALIZE标志

问题描述:

当我打电话前面的代码样品中的HeapCreate功能,我使用了HEAP_NO_SERIALIZE标志因为 其余的示例代码不是多线程安全。HEAP_NO_SERIALIZE标志

杰弗里里希特(通过C/C++的Windows)
在他的书中写的句子,但它的怪异。
如果代码不是多线程安全的,他不必使用该标志。
这是一个错误?或者我误解了一些东西?

通过HEAP_NO_SERIALIZE标志,您可以告诉Heap它永远不会被不同的线程访问,因此根本不需要线程安全性。

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

编辑:在这个示例中,因为它根本不是线程安全的(因此我假设不以任何方式使用线程),所以通知堆是非常合理的,它不能是线程安全的。

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

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

但是,如果你的应用程序没有使用多线程,关键部分可能有一个不可忽视的开销。为了消除这种开销,你必须传递标志HEAP_NO_SERIALIZE,它将删除对关键部分的调用,从而导致应用程序稍快。

+0

“不是多线程安全的”意思是“不使用多线程”? – Benjamin 2010-08-25 08:42:12

+0

我认为你(和DarthCoder)认为两个词都是平等的。你不是吗?但它看起来不同于我。 – Benjamin 2010-08-25 08:53:07

+0

线程安全意味着您的代码可以同时在多个线程中使用。不是线程安全的代码迟早会在多线程应用程序中崩溃。多线程本身意味着应用程序正在使用多个线程。您可以在单线程应用程序中使用线程安全的代码。但建议不要在多线程应用程序中使用非线程安全代码。 – Patrick 2010-08-25 11:28:54