为啥 std::thread 缺少基本功能? [关闭]

Posted

技术标签:

【中文标题】为啥 std::thread 缺少基本功能? [关闭]【英文标题】:Why std::thread lacks basic features? [closed]为什么 std::thread 缺少基本功能? [关闭] 【发布时间】:2019-01-17 22:24:49 【问题描述】:

std::thread:

创建线程时没有堆栈大小。 没有线程优先级。

为什么?这样的 API 有什么用?

这是线程概念的基础。

堆栈大小,为什么我们不关心内存?也许作者假设只有 Linux 和 Windows 具有分页内存和 64 位地址空间,但是没有分页内存的平台呢?

优先级,如何使任何系统在没有优先级的情况下具有可预测的时序?

【问题讨论】:

典型的 ISO 问题。 api 越大,就越难让每个人都同样不开心。 thread::native_handle() 函数是你自己动手做的后门。 AFAIK、分页内存和 64 位地址空间与线程堆栈无关,线程优先级也无法为您提供可预测的时序。 【参考方案1】:

线程创建时没有堆栈大小。

在 C++ 标准中,您的机器上什至需要有一个堆栈?我相信答案是:无处可去。

没有线程优先级。

C++ 标准中的哪些地方要求您的机器具有线程优先级?事实上,我怀疑你是否需要任何硬件支持才能将线程作为 C++ 的目标平台。

为什么?这样的API有什么用?

正如@HansPassant 所指出的 - 包括硬件供应商、编译器设计人员和操作系统设计人员在内的不同实体直接或间接地参与了对语言标准提案的考虑和评论。您在 API 中投入的越少,您对硬件提供的假设就越少,您对语言的提议添加就越容易被接受(无论是通过多数投票、共识还是更复杂的方式)。

【讨论】:

【参考方案2】:

因为每个平台都必须提供API。您仍然可以拥有针对没有线程的平台的 C++ 实现。

因为“堆栈”是一个实现细节。增加不一定存在的东西的大小是什么意思?

没有优先级时更改优先级是什么意思?

C++ 以抽象机器为目标。实现将抽象机器映射到目标机器(可能本身是抽象的)。该标准非常努力地不限制在它不需要的领域的实施。

std::thread 所做 提供的是一个(完全实现定义的)native_handle。这完全授权您以实现定义的方式执行实现定义的事情。

【讨论】:

以上是关于为啥 std::thread 缺少基本功能? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥构造 std::thread 时参数移动了两次

为啥 MinGW 中仍然没有 std::thread、std::promise 和 std::future? win32中promise和futures的替代方案是啥?

C ++ 20中的新线程(jthread)功能

为啥我会在这个程序中“中止”? [复制]

为啥将 std::mutex 引入成员类会产生此编译错误?

C++ std::thread概念介绍