它是内部counter的最大允许值吗?但是如何才能谈论最小最大值呢?max值不应该是const吗?怎么能改变呢?LeastMaxValue和counter有什么区别?
如其名称所示,LeastMaxValue是最小最大值,而不是实际最大值。因此max()可以产生一个大于LeastMaxValue的数字。信号量/最大构造函数调用
std::counting_semaphore<10> sem(5)创建一个信号量sem,其最大值至少为10,计数器为5. https://www.modernescpp.com/index.php/semaphores-in-c-20。
发布于 2021-12-24 00:36:18
最大值不应该是康斯特吗?
是。实际上,counting_semaphore::max()必须是constexpr,这意味着它不仅是常量,而且是编译时常量。对于给定的LeastMaxValue,max可能因编译而异,但仅此而已。
也许这就是你困惑的根源?从监视程序运行的角度来看,与给定的max()对应的LeastMaxValue是恒定的。从确保代码跨多个编译器和平台工作的角度来看,max()可能有所不同。
当您声明一个类型为std::counting_semaphore<5>的变量时,您声明该变量的计数器将需要上升到5。这将成为对编译器的请求,使计数器能够保存5。如果计数器能容纳255,那就好了。您不打算将计数器提高那么高,因此您的代码将在最大值下正确工作。
看看构造函数 of std::counting_semaphore<LeastMaxValue>。只要计数器的初始值满足0 <= initial和initial <= max(),这将正确运行。第一个条件很容易满足,但是如何满足第二个条件呢?您可以通过满足更严格的要求来做到这一点--确保initial <= LeastMaxValue。这更严格,因为编译器有义务确保在您选择LeastMaxValue时,相应的max()至少是同样大的;也就是说,LeastMaxValue <= max()。只要为LeastMaxValue指定一个足够高的值,构造函数就会按照您的初始值工作。
对于release()的正确工作也有类似的要求。正确的行为要求计数器不超过max(),您可以通过不超过LeastMaxValue来确保这一点。如果计数器在LeastMaxValue和max()之间结束,那么您确实会得到正确的行为,但是您会受到编译器的影响。不同的编译器可能会给您提供更低的max()。如果您想在这方面发挥作用,您的代码需要适应一个max(),它可以从编译器版本更改为编译器版本。
您可以认为这类似于int_fast8_t,因为8指定了类型的最小大小,但是编译器可以提供更多。您可以保证可以存储在此类型中的最大值至少是127 (最小最大值)。在这种类型中,您可能获得超过8位,因此能够存储更高的值,但您可能不会。
https://stackoverflow.com/questions/70467700
复制相似问题