std::this_thread 命名空间有技术原因吗?为什么这个命名空间的成员没有被实现为 std::thread 类的静态成员?
user2100815
问问题
2292 次
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 回答