1

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& );
};
4

1 に答える 1

4

ほとんどの標準ライブラリ オブジェクトとは異なり、std::threadの move コンストラクターは、moved-from の状態を明確に指示しthreadます。これは空のスレッドと同等です: thread.joinablewill be false.

于 2013-04-21T06:01:45.800 に答える