std::counting_semaphore<LeastMaxValue> 中的 LeastMaxValue 是什么?
What is LeastMaxValue in std::counting_semaphore<LeastMaxValue>?
它是内部 counter
的最大允许值吗?但是怎么可能谈论最小值最大值呢? max
值不应该是常量吗?怎么改? LeastMaxValue
和 counter
有什么区别?
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
,这意味着它不仅是常量,而且是编译时常量。对于给定的 LeastMaxValue
,max
可能因编译而异,但仅此而已。
也许这就是您困惑的根源?从看节目运行的角度来看,给定的LeastMaxValue
对应的max()
是不变的。从确保代码跨多个编译器和平台工作的角度来看,max()
可能会有所不同。
当您声明一个类型为 std::counting_semaphore<5>
的变量时,您就是在声明该变量的计数器需要上升到 5
。这成为向编译器请求计数器能够保持 5
。如果碰巧计数器可以容纳 255
,那很好。您不打算将计数器提高那么高,因此您的代码将在该最大值下正常运行。
看看std::counting_semaphore<LeastMaxValue>
的constructor。只要计数器的初始值满足0 <= initial
和initial <= max()
就可以正常工作。第一个条件很容易满足,但是第二个怎么满足呢?您可以通过满足更严格的要求来做到这一点——确保 initial <= LeastMaxValue
。这个比较严格,因为编译器有义务保证你选择的LeastMaxValue
,对应的max()
至少一样大;即 LeastMaxValue <= max()
。只要您为 LeastMaxValue
指定足够高的值,构造函数就会按预期使用您的初始值。
release()
也有类似的要求才能正常运行。正确的行为要求计数器不超过 max()
,您可以通过不超过 LeastMaxValue
来确保这一点。如果计数器在 LeastMaxValue
和 max()
之间结束,您确实会得到正确的行为,但是您会受到编译器的突发奇想的影响。不同的编译器可能会给你一个较低的 max()
。如果你想在这方面发挥作用,你的代码需要适应一个可以从编译器版本到编译器版本变化的max()
。
您可以认为这与 int_fast8_t
相似,因为 8
指定类型的最小大小,但编译器可以给您更多。您保证可以存储在此类型中的最大值至少为 127
(最小最大值)。您可能会在这种类型中获得超过 8 位,因此能够存储更高的值,但您可能不会。
它是内部 counter
的最大允许值吗?但是怎么可能谈论最小值最大值呢? max
值不应该是常量吗?怎么改? LeastMaxValue
和 counter
有什么区别?
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
,这意味着它不仅是常量,而且是编译时常量。对于给定的 LeastMaxValue
,max
可能因编译而异,但仅此而已。
也许这就是您困惑的根源?从看节目运行的角度来看,给定的LeastMaxValue
对应的max()
是不变的。从确保代码跨多个编译器和平台工作的角度来看,max()
可能会有所不同。
当您声明一个类型为 std::counting_semaphore<5>
的变量时,您就是在声明该变量的计数器需要上升到 5
。这成为向编译器请求计数器能够保持 5
。如果碰巧计数器可以容纳 255
,那很好。您不打算将计数器提高那么高,因此您的代码将在该最大值下正常运行。
看看std::counting_semaphore<LeastMaxValue>
的constructor。只要计数器的初始值满足0 <= initial
和initial <= max()
就可以正常工作。第一个条件很容易满足,但是第二个怎么满足呢?您可以通过满足更严格的要求来做到这一点——确保 initial <= LeastMaxValue
。这个比较严格,因为编译器有义务保证你选择的LeastMaxValue
,对应的max()
至少一样大;即 LeastMaxValue <= max()
。只要您为 LeastMaxValue
指定足够高的值,构造函数就会按预期使用您的初始值。
release()
也有类似的要求才能正常运行。正确的行为要求计数器不超过 max()
,您可以通过不超过 LeastMaxValue
来确保这一点。如果计数器在 LeastMaxValue
和 max()
之间结束,您确实会得到正确的行为,但是您会受到编译器的突发奇想的影响。不同的编译器可能会给你一个较低的 max()
。如果你想在这方面发挥作用,你的代码需要适应一个可以从编译器版本到编译器版本变化的max()
。
您可以认为这与 int_fast8_t
相似,因为 8
指定类型的最小大小,但编译器可以给您更多。您保证可以存储在此类型中的最大值至少为 127
(最小最大值)。您可能会在这种类型中获得超过 8 位,因此能够存储更高的值,但您可能不会。