C++ 如何测试std::线程是否从中移动?

C++ 如何测试std::线程是否从中移动?,c++,multithreading,c++11,move-semantics,C++,Multithreading,C++11,Move Semantics,我有一个带有std::thread成员的可移动的不可复制类 当类析构函数运行时,我需要做一些清理工作并加入线程。 如果类从中移动,我需要析构函数跳过清理和线程连接。 我可以通过存储从中移动的bool来实现这一点,但这似乎有点浪费 如果std::thread成员是从中移动的,那么我知道这个类实例是从中移动的。是否可以检查std::thread成员是否已从中移动 class Widget { Widget() { // initialize } Wi

我有一个带有std::thread成员的可移动的不可复制类

当类析构函数运行时,我需要做一些清理工作并加入线程。 如果类从中移动,我需要析构函数跳过清理和线程连接。 我可以通过存储从中移动的bool来实现这一点,但这似乎有点浪费

如果std::thread成员是从中移动的,那么我知道这个类实例是从中移动的。是否可以检查std::thread成员是否已从中移动

class Widget
{
    Widget()
    {
        // initialize
    }

    Widget( Widget&& rhs )
    {
        t = std::move(rhs.t);
    }

    ~Widget()
    {
        if ( t_is_not_moved_from() )
        {
            // do cleanup
            t.join();
        }
    }

    inline friend void swap( Widget& lhs, Widget& rhs )
    {
        lhs.t.swap( rhs.t );
    }

private:
    std::thread t;

    // noncopyable
    Widget( const Widget& );
    const Widget& operator=( const Widget& );
};

与大多数标准库对象不同,std::thread的move构造函数确实明确规定了从线程移动的对象的状态。它等同于一个空线程:thread.joinable将为false。

与大多数标准库对象不同,std::thread的move构造函数明确规定了从线程移动的状态。它等同于一个空线程:thread.joinable将为false。

您不必为std::thread编写移动构造函数和析构函数。默认生成的构造函数将完全执行您希望执行的操作。您不必为std::线程编写移动构造函数和析构函数。默认生成的线程将完全执行您希望执行的操作。@MichaelMarcin:是的,在已从线程移动的线程上调用joinable是安全的。此成员函数没有任何先决条件,因此,无论线程处于何种未指定状态,都可以调用它。@HowardHinnant:从线程移动的状态不是未指定的。该规范显然是空的:线程的id将处于默认构造状态。@MichaelMarcin:是的,在从线程移动的情况下调用joinable是安全的。此成员函数没有任何先决条件,因此,无论线程处于何种未指定状态,都可以调用它。@HowardHinnant:从线程移动的状态不是未指定的。规范很清楚,它将是空的:线程的id将处于默认构造状态。