首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeastMaxValue in std::counting_semaphore<LeastMaxValue>是什么?

LeastMaxValue in std::counting_semaphore<LeastMaxValue>是什么?
EN

Stack Overflow用户
提问于 2021-12-23 21:46:30
回答 1查看 412关注 0票数 0

它是内部counter的最大允许值吗?但是如何才能谈论最小最大值呢?max值不应该是const吗?怎么能改变呢?LeastMaxValuecounter有什么区别?

如其名称所示,LeastMaxValue是最小最大值,而不是实际最大值。因此max()可以产生一个大于LeastMaxValue的数字。信号量/最大构造函数调用std::counting_semaphore<10> sem(5)创建一个信号量sem,其最大值至少为10,计数器为5. https://www.modernescpp.com/index.php/semaphores-in-c-20

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-24 00:36:18

最大值不应该是康斯特吗?

是。实际上,counting_semaphore::max()必须是constexpr,这意味着它不仅是常量,而且是编译时常量。对于给定的LeastMaxValuemax可能因编译而异,但仅此而已。

也许这就是你困惑的根源?从监视程序运行的角度来看,与给定的max()对应的LeastMaxValue是恒定的。从确保代码跨多个编译器和平台工作的角度来看,max()可能有所不同。

当您声明一个类型为std::counting_semaphore<5>的变量时,您声明该变量的计数器将需要上升到5。这将成为对编译器的请求,使计数器能够保存5。如果计数器能容纳255,那就好了。您不打算将计数器提高那么高,因此您的代码将在最大值下正确工作。

看看构造函数 of std::counting_semaphore<LeastMaxValue>。只要计数器的初始值满足0 <= initialinitial <= max(),这将正确运行。第一个条件很容易满足,但是如何满足第二个条件呢?您可以通过满足更严格的要求来做到这一点--确保initial <= LeastMaxValue。这更严格,因为编译器有义务确保在您选择LeastMaxValue时,相应的max()至少是同样大的;也就是说,LeastMaxValue <= max()。只要为LeastMaxValue指定一个足够高的值,构造函数就会按照您的初始值工作。

对于release()的正确工作也有类似的要求。正确的行为要求计数器不超过max(),您可以通过不超过LeastMaxValue来确保这一点。如果计数器在LeastMaxValuemax()之间结束,那么您确实会得到正确的行为,但是您会受到编译器的影响。不同的编译器可能会给您提供更低的max()。如果您想在这方面发挥作用,您的代码需要适应一个max(),它可以从编译器版本更改为编译器版本。

您可以认为这类似于int_fast8_t,因为8指定了类型的最小大小,但是编译器可以提供更多。您可以保证可以存储在此类型中的最大值至少是127 (最小最大值)。在这种类型中,您可能获得超过8位,因此能够存储更高的值,但您可能不会。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70467700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档