标准实验闩锁和屏障使用ptrdiff_t

时间:2017-08-24 08:55:48

标签: c++ concurrency c++-standard-library

我正在查看C++ experimental extensions for concurrency并注意到新的同步类latchbarrierflex_barrier。它们都实现了标准的barrier,无论是单次使用还是可重复使用。

当前文档为其构造函数声明了以下签名:

explicit latch( ptrdiff_t value );
explicit barrier( std::ptrdiff_t num_threads );
explicit flex_barrier( std::ptrdiff_t num_threads );

valuenum_threads参数进行以下说明:

  

- 内部计数器的初始值;一定是   非负

     

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

     

num_threads - 数量   flex_barrier的参与线程;必须是非负面的

所有三个构造函数都接受std::ptrdiff_t类型的参数,这是一个有符号整数类型。然后文档明确指出该值必须是非负的。

我的问题:选择std::ptrdiff_t类型作为参数类型而不是无符号整数类型(例如std::size_t)的理由是什么。在我看来,使用无符号整数类型更安全,因为永远不会使用无效的参数值调用构造函数。

我知道当前的定义是 experimental 并且倾向于改变,但是,当前的参数类型被明确选择为有符号整数类型。所以背后一定有某种想法,不是吗?

1 个答案:

答案 0 :(得分:5)

这一变化是在2015年2月在科隆举行的C ++ WG21会议上进行的讨论之后做出的。我不在场,但我将WG的反馈意见纳入了该文件。 AFAIK关于具有无符号值的担忧是负的有符号数可能会意外地被转换为无符号值。就使用(defmethod jd/from-java java.util.Map [m] (zipmap (map jd/from-java (keys m)) (map jd/from-java (vals m)))) 而言,我们希望确保这些概念可用于为可能存在大量子任务的GPU编写的应用程序。