Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在运行时cpp删除未就绪对象_C++_Multithreading - Fatal编程技术网

C++ 在运行时cpp删除未就绪对象

C++ 在运行时cpp删除未就绪对象,c++,multithreading,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

考虑下课

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.
}
类测试{
私人:长id;
//某个领域。。。。
public:test(){};
空做某事{
//一些巨大的行动。。。。
}
void do\u something\u other(void*arg){
//还有一个巨大的工作量。。。。。
}
}
///////////////////////////
空*螺纹(空*螺纹){
测试*ins=(测试*)\u ins;
//一些工作
如果()
}
///////////////////////////
int main(){
test*ins=新测试();
//将ins传递给10个线程。
}
假设有10个线程使用一个共享对象,当其中一个线程删除该对象时,程序退出。 问题: 当对象被删除时,如何在运行时获得任何错误/异常<代码>尝试捕获没有帮助。有什么解决办法吗
是否有任何线程安全且一致的方法来计算使用此对象的当前线程数?
是否有任何基于事件的解决方案可以在对象准备清除时触发事件?

提前感谢。

C++11使用参考计数值的原子增量/减量

标准保证只有一个线程会调用共享对象上的delete操作符


您需要确保的是关键部分已同步,即:如果线程仍在使用共享对象,则不会释放该对象。您可以使用它(信号量可以使用互斥量和条件变量实现,例如)。

您可以使用C++11共享指针(它们有一个共享实例的引用计数):确保在线程中同步检查与您的问题无关的计数(例如,使用互斥量或类似的东西),但是不要使用带前导下划线的全局名称,因为这些名称是由规范保留的。@DavidKernin谢谢dude,或者
std::shared_ptr
都没有帮助。因为正如你提到的,我必须计算线程安全性。但这根本不安全。因为两个线程将一次更改值(一次增加/一次减少),如果第一个线程先执行,它将删除导致第二个线程出错的对象。使用std::shared_ptr,这是线程安全的。通常,您希望在多线程代码中有关键部分来保护共享对象。查找std::mutex.shared_ptr+mutex是一个不错的选择,再次阅读我的帖子谢谢你,伙计,你是国王。