Lea*_*ner 9 c++ multithreading operator-overloading new-operator
对于特定于类的new_handler实现,我在"有效的c ++"一书中遇到了以下示例.这看起来在多线程环境中存在问题,我的问题是如何在多线程环境中实现类特定的new_handler?
void * X::operator new(size_t size)
{
new_handler globalHandler = // install X's
std::set_new_handler(currentHandler); // handler
void *memory;
try { // attempt
memory = ::operator new(size); // allocation
}
catch (std::bad_alloc&) { // restore
std::set_new_handler(globalHandler); // handler;
throw; // propagate
} // exception
std::set_new_handler(globalHandler); // restore
// handler
return memory;
}
Run Code Online (Sandbox Code Playgroud)
你说得对。这可能不是线程安全的。您可能需要考虑另一种方法,例如使用以下nothrow版本new:
void* X::operator new(std::size_t sz) {
void *p;
while ((p = ::operator new(sz, std::nothrow) == NULL) {
X::new_handler();
}
return p;
}
Run Code Online (Sandbox Code Playgroud)
这将导致每当内存分配失败时调用特定于类的处理程序。在您真正了解有关超载的所有令人头疼的问题之前,我不会这样做operator new。特别是,请阅读 Herb Sutter 的两部分文章To New, Perchance To Throw, Part 1和Part 2。有趣的是,他说要避免这个nothrow版本……嗯。
| 归档时间: |
|
| 查看次数: |
1797 次 |
| 最近记录: |