std::counting_semaphore<LeastMaxValue> 中的 LeastMaxValue 是什么?

What is LeastMaxValue in std::counting_semaphore<LeastMaxValue>?

它是内部 counter 的最大允许值吗?但是怎么可能谈论最小值最大值呢? max 值不应该是常量吗?怎么改? LeastMaxValuecounter 有什么区别?

As its name indicates, the LeastMaxValue is the minimum max value, not the actual max value. Thus max() can yield a number larger than LeastMaxValue. https://en.cppreference.com/w/cpp/thread/counting_semaphore/max

The constructor call std::counting_semaphore<10> sem(5) creates a semaphore sem with an at least maximal value of 10 and a counter of 5. https://www.modernescpp.com/index.php/semaphores-in-c-20

Shouldn't max value be const?

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

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


当您声明一个类型为 std::counting_semaphore<5> 的变量时,您就是在声明该变量的计数器需要上升到 5。这成为向编译器请求计数器能够保持 5。如果碰巧计数器可以容纳 255,那很好。您不打算将计数器提高那么高,因此您的代码将在该最大值下正常运行。

看看std::counting_semaphore<LeastMaxValue>constructor。只要计数器的初始值满足0 <= initialinitial <= max()就可以正常工作。第一个条件很容易满足,但是第二个怎么满足呢?您可以通过满足更严格的要求来做到这一点——确保 initial <= LeastMaxValue。这个比较严格,因为编译器有义务保证你选择的LeastMaxValue,对应的max()至少一样大;即 LeastMaxValue <= max()。只要您为 LeastMaxValue 指定足够高的值,构造函数就会按预期使用您的初始值。

release() 也有类似的要求才能正常运行。正确的行为要求计数器不超过 max(),您可以通过不超过 LeastMaxValue 来确保这一点。如果计数器在 LeastMaxValuemax() 之间结束,您确实会得到正确的行为,但是您会受到编译器的突发奇想的影响。不同的编译器可能会给你一个较低的 max()。如果你想在这方面发挥作用,你的代码需要适应一个可以从编译器版本到编译器版本变化的max()

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