aJ.*_*aJ. 15 c++ multithreading destructor
我正在浏览遗留代码并找到以下代码段:
MyClass::~MyClass()
{
EnterCriticalSection(&cs);
//Access Data Members, **NO Global** members are being accessed here
LeaveCriticalSection(&cs);
}
Run Code Online (Sandbox Code Playgroud)
我想知道它有没有机会保护析构函数?
考虑一个场景:
1. Thread1 - About to execute any of the member function which uses critical section
2. Thread2- About to execute destructor.
Run Code Online (Sandbox Code Playgroud)
如果执行顺序是1 => 2那么它可能会起作用.但如果订单被撤销怎么办?
这是一个设计问题吗?
Meh*_*ari 35
在使用对象时不应调用析构函数.如果你正在处理这种情况,它需要一个基本的解决方案.然而,析构函数可能想要改变一些其他东西(与被破坏的类无关),并且它可能需要一个关键部分(例如,递减全局计数器).
我认为你有一个更根本的问题。当另一个线程仍在调用成员函数时,在一个线程上销毁您的对象应该是不合法的。这本身就是错误的。
即使您成功地使用临界区保护了析构函数,当另一个线程开始执行函数的其余部分时会发生什么?它将在删除的对象上这样做(取决于它的分配位置)将是垃圾内存或简单的无效对象。
您需要更改代码以确保对象在仍在使用时不会被破坏。
| 归档时间: |
|
| 查看次数: |
7411 次 |
| 最近记录: |