4

std::this_thread 命名空间有技术原因吗?为什么这个命名空间的成员没有被实现为 std::thread 类的静态成员?

4

1 回答 1

15

原始提案中,无论您是为自己获取还是为子线程获取 a 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 的名称相同)。

这是一个可能的替代设计:

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

这种设计的一个缺点是它不能编译:

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 回答