【发布时间】:2011-12-06 01:14:02
【问题描述】:
虽然标准不保证new 的线程安全,但大多数多线程操作系统support thread-safe operator new。
我正在为我的代码中某些class(比如MyClass)的动态分配实现我自己的内存管理。对于MyClass 的线程安全,我可能不得不使用pthread 或boost:: 库。
我认为如果new已经线程安全,那么我可以为MyClass 重载它并利用它的安全性而不必担心使用这些库。
class MyClass {
// data
public:
void* operator new (size_t);
void operator delete (void*);
};
对于 C++03 系统/编译器,这是一个公平的假设吗?
编辑:因为我的问题并没有被少数用户关注。我正在详细说明那部分:
如果我有 2 个线程分别执行 new int() 和 new int(),则将返回 2 个唯一的内存地址。现在,在我重载的MyClass::new 中,我没有使用全局::new() 或任何线程库;但是自己的内存管理器(它对线程一无所知)。伪代码:
char pool[BIG_SIZE];
void* MyClass::operator new (size_t size)
{
// get some memory from 'pool' without using any thread library
return p;
}
我的假设是,由于全局 ::new 是线程安全的,因此重载的 operator new 也应该是线程安全的。换句话说,编译器应该在遇到new 关键字的任何地方发出与线程安全相关的代码。这是一个正确的假设吗?
【问题讨论】:
-
MyClass::operator new只是一个语法有些奇怪的常规函数。它与任何::operator new变体无关,也不会神奇地继承它们的线程安全性。 -
正如您已经说过的那样,大多数编译器确实提供了 new 的线程安全版本,尽管 C++03 标准不保证相同。那么 Q 是什么?您将需要依赖您所针对的编译器的文档,如果您的意思是从可移植性的角度来看,由于标准没有明确要求 new 是线程安全的,严格来说它不是 100% 可移植的,但它仍然是一个公平的假设,给定大多数编译器都实现了它。
-
@Als,在给定的平台中,如果
new是线程安全的,那么假设它的重载版本(对于某些class)也是是线程是否公平安全吗? -
这完全取决于您在重载新代码时编写的代码。实际上,这适用于任何线程安全的 api/construct。api 或构造本身是线程安全的,但如果它们的使用不是以线程安全的方式完成,则没有实现可以保证它们是线程安全的。
标签: c++ thread-safety operator-overloading new-operator