在c ++中std :: thread class vs std :: this_thread命名空间?

时间:2015-11-22 10:14:17

标签: c++ multithreading

当我们已经有int b = 1; int n = 1; if (allNumbers - PerGroup == 0) { return 1; } else if (allNumbers - PerGroup == 1) { return allNumbers; } else { for (int i = 1; i <= allNumbers; i++) { b *= i; } for (int i = 1; i <= allNumbers - PerGroup; i++) { n *= i; } if (Enumerable.Range(1,int.MaxValue).Contains(b/n)) //line with ERROR! { return b/n; } else { return int.MaxValue; } } 类时,为什么我们需要std::thread命名空间?

它们之间有什么基本差异?

我什么时候应该使用std::this_thread类和std::thread命名空间?

2 个答案:

答案 0 :(得分:5)

this_thread命名空间分组访问当前线程的函数,因此当我们需要在当前线程上执行某些操作时,我们不需要访问该线程的thread对象。

线程类不提供让步和休眠的访问权限,这些函数只对当前线程有意义,因此可以在this_thread命名空间中找到。

如果我们希望获得有关不同线程的信息,我们需要该线程的thread实例,如果我们需要访问当前线程,我们总是可以通过this_thread命名空间中的函数来实现

扩展草案中也解释了使用this_thread命名空间的想法:

  

this_thread命名空间

     

请注意,当您请求当前线程的id时,使用this_thread命名空间消除歧义,而不是子线程的id。此操作的get_id名称保持不变,以减少接口的概念占用空间。此设计也适用于cancellation_requested函数:

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

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

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2320.html

添加this_thread命名空间中的函数作为thread类的静态成员可能已经完成,但是get_id函数必须被调用其他东西,才能实现明显不同于线程类的现有get_id函数。换句话说,我的猜测是C ++团队决定将函数添加到一个单独的命名空间,以便更清楚地表明这些函数正在读取或操作当前线程,如果将它们简单地添加为静态则不会同样清楚线程类的成员。

答案 1 :(得分:2)

std::thread用于创建,监控和操作新主题
std::this_thread用于 alreay created threads

你可以在this_thread内的公共类中提供std::thread作为静态方法,但这是一个设计决定,我敢说这种设计更像Java,将数据封装为命名空间更多是C ++ - pilosophy调整设计。