线程在销毁包含该线程的对象时调用 thread.detach()
Thread calling thread.detach() on itself when destroying object which contains that thread
我有一个具有属性线程的类。它看起来像这样。
class myClass {
public:
myClass(ClassB * x) {
myThread = thread(&myClass::run, this);
classB = x;
}
~myClass() { myThread.detach(); }
void run() {
while (something) {
// do your work.
}
classB->endThisObject(this);
}
private:
thread myThread;
ClassB * classB;
}
我的B类看起来像这样。
ClassB {
public:
endThisObject(myClass * x) { delete x; }
}
所以基本上myThread的最后一个操作是使用另一个对象销毁自己。是奥基还是这会引起很多麻烦?我正在测试我的代码,我没有泄漏,但这对我来说似乎有点不对劲。
除了线程,只需查看以下代码:
B b;
MyClass myclass(&b);
B
实例将盲目且无情地调用指向未使用new
创建的对象的指针 delete 。
另外,应该注意的是,您的run
函数基本上是在调用delete this
,这是合法的,但(至少)有点争议(例如,请参阅此处)。
我会给 MyClass 一个start
和一个join
的方法,如下所示:
void MyClass::start()
{
myThread = thread(&myClass::run, this);
}
void MyClass::join()
{
myThread.join();
}
这些方式可以从类外部控制线程执行,并以更简单、更安全的方式管理内存:
MyClass myclass;
myclass.start();
myclass.join();
//no need to call delete, here
或
auto p = std::make_unique<MyClass>();
p->start();
p->join();
//done (and no delete, again)
相关文章:
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 通过 Qt 中的线程调用 Rust 库
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 由并发无序映射查找线程调用的函数是否安全?
- 如何从另一个线程调用颤振引擎方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 从多个线程调用 std::shuffle
- std::thread::join() 可以从非父线程调用吗?
- 如何使用 Win32 API 从 Excel VBA 中的非"Single-Threaded Apartment"线程调用 InternetGetProxyInfo
- 带参数的线程调用库函数
- 如何在本机C++中跨线程调用(在主线程上回调)
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 优雅断言函数不是从多个线程调用的
- 从第二个线程调用Qt信号有效 - >对连接的插槽没有影响
- 包装标准::线程调用函数
- 从 Visual C++ 2010 中的单独线程调用消息框