在运行时cpp删除一个未就绪的对象

时间:2014-02-12 17:07:54

标签: c++ multithreading

考虑以下课程

class test{
private: long long id;
//some field....
public: test(){};
void do_something(){
//some huge operations....
}
void do_something_else(void* arg){
//yet another huge work load.....
}
}
///////////////////////////
void* _thread(void* _ins){
test* ins=(test*)_ins;
//some work
if(<<some condition>>){delete ins;}//not thread safe, std::auto_ptr doesn't help anymore
}
///////////////////////////
int main(){
test *ins=new test();
//pass the ins to 10 thread.
}

考虑有10个线程使用共享对象,当有一个线程删除对象时,程序退出。 问题: 如何在删除对象时在运行时获取任何错误/异常? try-catch没有帮助。任何解决方案?!
是否有任何线程安全和一致的方法来计算使用此对象的当前线程?
是否有任何基于事件的解决方案在对象准备好清除时触发事件?

提前感谢。

1 个答案:

答案 0 :(得分:1)

C ++ 11的shared_ptrs使用原子增量/减量的引用计数值。

标准保证只有一个线程会在共享对象上调用delete运算符

您需要确保您的关键部分是同步的,即:如果线程仍在使用它,则不会释放共享对象。您可以使用std::mutex(信号量可以使用互斥锁和条件变量实现,例如https://stackoverflow.com/a/4793662/1938163