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关键字时都应该发出线程安全相关的代码。这是一个正确的假设吗?
这是。
但请注意,在 C++11 中 new 是线程安全的。
当然,当您添加线程不安全代码时,它会使您的operator new 线程不安全。
根据您的编辑(改变了整个问题):
编译器在新调用周围添加线程安全代码的假设是非常错误的。Sane 实现始终会在operator new 的内部实现中添加线程安全性(已经出于效率考虑,例如每线程内存池)。
也就是说,当你编写一个线程不安全的分配函数时,仅仅通过命名它operator new并不会神奇地使它成为线程安全的,因为这就像任何其他函数一样,只是用特殊的方式来调用。
| 归档时间: |
|
| 查看次数: |
2610 次 |
| 最近记录: |