重载运算符 new 的线程安全

iam*_*ind 5 c++ operator-overloading thread-safety new-operator

尽管标准不保证 的线程安全new,但大多数多线程操作系统都支持线程安全 operator new

我正在实现自己的内存管理,以动态分配代码中的某些class(例如)。MyClass为了线程安全MyClass,我可能必须使用pthreadorboost::库。

我认为如果已经new是线程安全的,那么我可以重载它并利用它的安全性,而不必担心使用这些库。MyClass

class MyClass {
// data
public:
  void* operator new (size_t);
  void operator delete (void*);
};
Run Code Online (Sandbox Code Playgroud)

对于 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;
}
Run Code Online (Sandbox Code Playgroud)

我的假设是,由于全局::new是线程安全的,因此重载operator new也应该是线程安全的。换句话说,编译器在遇到new关键字时都应该发出线程安全相关的代码。这是一个正确的假设吗?

Pla*_*aHH 5

这是。

但请注意,在 C++11 中 new 是线程安全的。

当然,当添加线程不安全代码时,它会使您的operator new 线程不安全。

根据您的编辑(改变了整个问题):

编译器在新调用周围添加线程安全代码的假设是非常错误的。Sane 实现始终会在operator new 的内部实现中添加线程安全性(已经出于效率考虑,例如每线程内存池)。

也就是说,当你编写一个线程不安全的分配函数时,仅仅通过命名它operator new并不会神奇地使它成为线程安全的,因为这就像任何其他函数一样,只是用特殊的方式来调用。