如何测试std :: thread是否被移动?

时间:2013-04-21 05:35:25

标签: c++ multithreading c++11 move-semantics

我有一个带有std :: thread成员的可移动noncopyable类。

当类析构函数运行时,我需要做一些清理工作并加入线程。 如果类被移动,我需要析构函数跳过清理和线程连接。 我可以通过存储从中移动的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& );
};

1 个答案:

答案 0 :(得分:4)

与大多数标准库对象不同,std::thread的移动构造函数确实明确规定了移动thread的状态。空线程是恰当的:thread.joinable将为false