多线程环境中的析构函数?

sap*_*ito 6 c++ multithreading

我想知道这样一个课程会发生什么:

class MyClass
{
private:
    std::vector<int> iVector;
    void Worker()
    {
        //Lots of stuff done with iVector
        //adding, removing elements, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我创建了一个使用iVector并修改它的线程(由其中一个类成员函数调用).除了这个worker之外,该类的其他成员函数都没有读取或修改这个std :: vector.

一切似乎都很好,因为工作线程是唯一使用iVector的线程.

但是当一个对象实例被销毁时会发生什么?即使在工作线程完成后对象被销毁,也会从主线程调用iVector的析构函数.这会导致未定义的行为吗?

谢谢!

Val*_*ity 3

首先,我建议std::join在析构函数中的线程上运行(或您的库中的等效项)。这将确保线程在向量析构函数运行之前正确完成并同步。这很重要,因为向量的生命周期必须超过使用它的线程。

\n\n

C++11 标准以及可能的后续标准在 30.3.1.5 中声明:

\n\n
\n

5:同步:*this\n代表的线程完成与(1.10)对应的join()成功返回同步。[\n 注意:*this 上的操作不同步。\xe2\x80\x94 尾注]

\n
\n\n

现在我们必须检查 1.10 以了解更多详细信息,首先本节指出:

\n\n
\n

3:线程T在特定点可见的对象的值是该对象的初始值、T分配给该对象的值、或者另一个线程分配给该对象的值,根据\n 以下规则。

\n
\n\n

老实说,这很难解析,它没有具体指定提供哪种同步连接,并且似乎暗示它仅同步线程本身,而不同步其访问的数据。因此,我会走安全路线,atomic_thread_fence(memory_order_acquire)在主线程中 join 之后运行,并atomic_thread_fence(memory_order_release)在子线程完成之前运行,这应该保证在语义之前完全发生,并且没有 UB。

\n