C++ 标准实验闩锁和屏障使用ptrdiff\t

C++ 标准实验闩锁和屏障使用ptrdiff\t,c++,concurrency,c++-standard-library,C++,Concurrency,C++ Standard Library,我在查看时注意到了新的同步类latch、barrier、和flex\u barrier。它们都实现了一个标准,可以是一次性使用,也可以是可重用的 当前文件规定了其施工人员的以下签名: explicit latch( ptrdiff_t value ); explicit barrier( std::ptrdiff_t num_threads ); explicit flex_barrier( std::ptrdiff_t num_threads ); 对值或num_threads参数进行以下解

我在查看时注意到了新的同步类
latch
barrier
、和
flex\u barrier
。它们都实现了一个标准,可以是一次性使用,也可以是可重用的

当前文件规定了其施工人员的以下签名:

explicit latch( ptrdiff_t value );
explicit barrier( std::ptrdiff_t num_threads );
explicit flex_barrier( std::ptrdiff_t num_threads );
num_threads
参数进行以下解释:

内部计数器的初始值;必须是 非负

num_threads-参与的线程数 障碍;必须是非负的

num_线程数-线程数 flex_屏障的参与螺纹;必须是非负的


所有三个构造函数都接受类型为的参数,该参数是有符号整数类型。然后,文档明确说明该值必须为非负值

我的问题:选择
std::ptrdiff\u t
类型作为参数类型而不是无符号整数类型(例如)的基本原理是什么。在我看来,使用无符号整数类型更安全,因为构造函数永远不能用无效的参数值调用


我知道当前的定义是实验性的,并且倾向于改变,但是,当前的参数类型被显式地选择为有符号整数类型。所以,在这背后有某种想法,不是吗?< / P > P >这一变化是在2015年2月在Cologne召开的C++ WG21会议之后讨论的。我当时不在场,但我将工作组的反馈纳入了文件中。有一个问题是,如果使用无符号值,负号可能会意外地转换为无符号值。就使用
short
而言,我们希望确保这些概念在为GPU编写的应用程序中可用,因为GPU中可能有大量的子任务。

事实上,
std::experiative::latch
来自该提案,其作者没有证明他们选择
std::ptrdiff\u t
是合理的。也许我们应该问问他们?@HansOlsson
std::ptrdiff\u t
的最大值在现代系统上仍然大得可笑()。那么为什么不简单地使用
无符号short
作为类型呢?让我感到奇怪的是,他们选择了一个有符号的类型,然后必须明确地记录它必须是非负的这一事实;而使用无符号类型已经传递了此类信息。
无符号short
会有点奇怪。“使用
int
,除非有充分的理由不使用”规则似乎也适用于这里。标准中有一个推动因素,即仅对位标志和按位操作使用无符号类型。对于数学而言,有符号类型至少为您提供了一种可靠的调试溢出的方法(因为它是UB,所以允许一个实现为您提供调试信息),而无符号溢出是一种很不幸的定义良好且无法可靠地标记为错误的方法。计数整数似乎比按位运算更容易用于数学,那么具体来说,如何使用
std::ptrdiff_t
而不是任何其他语义不太具体的有符号整数呢?科隆会议的反馈是,
signed long
ptrdiff_t
将是合适的类型。我们选择了
ptrdiff\u t
。我不知道这是否是理想的解决方案,但我们没有从随后的会议中听到进一步的反馈,认为这是错误的。根据我的经验,我使用了类似于
向量
的屏障。如果我们不打算使用
vector::size\u type
,那么
vector::difference\u type
似乎是一个合乎逻辑的选择。当然,我们不想将屏障的使用限制在向量使用的类型上,但原则是从
size\u t
->
ptrdiff\u t
中概括出来的。无论如何,这是我对委员会想法的猜测。