【发布时间】:2016-10-08 05:07:18
【问题描述】:
我想知道在这样的课程中会发生什么:
class MyClass
{
private:
std::vector<int> iVector;
void Worker()
{
//Lots of stuff done with iVector
//adding, removing elements, etc.
}
}
假设我创建了一个使用 iVector 并对其进行修改的线程(由其中一个类成员函数调用)。除了这个 worker 之外,该类的其他成员函数都不会读取或修改这个 std::vector。
一切似乎都很好,因为工作线程是唯一使用 iVector 的线程。
但是当对象的一个实例被销毁时会发生什么?即使对象在工作线程完成后被销毁,iVector 的析构函数也会从主线程调用。这会导致未定义的行为吗?
谢谢!
【问题讨论】:
-
如果对象的生命周期长于线程或对象的任何其他用途,则没有UB。
-
顺便说一句,如果向量只被线程使用而没有其他地方使用,为什么不把它作为线程内部的局部变量呢?那么你也不必担心这样的事情。
-
对象的生命周期不再由线程决定。但是为什么在线程B(工作线程)中修改了线程A中的vector就可以销毁呢?
-
看来我误会了你。对象(以及向量)是否被多个线程使用?那么生命周期必须大于或等于 所有 个使用它的线程。
-
向量被任何线程使用它的数据或方法。如果主线程运行析构函数,则该向量也被主线程使用。您必须确保工作线程和主线程之间没有数据竞争。除此之外,没有理由使用 UB。
标签: c++ multithreading