4

std::this_thread 名前空間に技術的な理由はありますか? この名前空間のメンバーが std::thread クラスの静的メンバーとして実装されていないのはなぜですか?

4

1 に答える 1

15

元の提案から、を取得する方法は、自分自身のために取得するか、子スレッドのために取得するかにかかわらず、thread::id綴られています。get_id()thread::id

this_thread現在のスレッドのIDと子スレッドのIDを要求するときに、名前空間を使用して曖昧さを解消することに注意してください。get_idこのアクションの名前は、インターフェイスの概念的なフットプリントを削減するために同じままです。

std::thread my_child_thread(f);
typedef std::thread::id ID;

ID my_id = std::this_thread::get_id();  // The current thread's id
ID your_id = my_child_thread.get_id();  // The child   thread's id

したがって、this_thread名前空間は、概念的なインターフェイスを最小限に抑えながら(スレッドIDを取得するための同じ名前)、2つを区別するための読みやすい方法です。

考えられる代替設計は次のとおりです。

struct thread
{
    static int get_id() {return 1;}
    int get_id() const {return 2;}
};

この設計の欠点の1つは、コンパイルされないことです。

test.cpp:4:9: error: static and non-static member functions with the same parameter types cannot be overloaded
    int get_id() const {return 2;}
        ^
test.cpp:3:16: note: previous declaration is here
    static int get_id() {return 1;}
               ^
1 error generated.

別の設計では、静的メンバーに別の名前が付けられます。しかし、今ではインターフェースが大きくなっています。元の提案でも、別の関数をまったく同じように扱いました。

bool have_i_been_canceled = std::this_thread::cancellation_requested();  // Current thread's cancellation status
bool have_you_been_canceled = my_child_thread.cancellation_requested();  // Child   thread's cancellation status

したがって、クライアントがそれほど多くの名前を学ぶ必要がないように、名前を再利用することは非常に理にかなっています。this_thread現在のスレッドを照会する場合は、名前空間の使用方法を学ぶ必要があります。残念ながら、委員会は標準化中にスレッドのキャンセルを削除しました。

于 2013-02-22T20:46:37.257 に答える