它是內部的最大允許值counter嗎?但是怎么可能談論最小最大值呢?max值不應該是常量嗎?如何更改?LeastMaxValue和 和有什么不一樣counter?
顧名思義,LeastMaxValue 是最小值的最大值,而不是實際的最大值。因此 max() 可以產生一個大于 LeastMaxValue 的數字。 https://en.cppreference.com/w/cpp/thread/counting_semaphore/max
建構式呼叫
std::counting_semaphore<10> sem(5)創建一個信號量 sem,其最大值至少為 10,計數器為 5。 https://www.modernescpp.com/index.php/semaphores-in-c-20
uj5u.com熱心網友回復:
最大值不應該是常量嗎?
是的。事實上,counting_semaphore<LeastMaxValue>::max()必須是constexpr,這意味著它不僅是常量,而且是編譯時常量。對于給定的LeastMaxValue,max可能因編譯而異,但僅此而已。
也許這就是你困惑的根源?從觀看程式運行的角度來看,max()給定的對應LeastMaxValue是常數。從確保代碼跨多個編譯器和平臺作業的角度來看,max()可能會有所不同。
當您宣告一個型別為 的變數時std::counting_semaphore<5>,您就是在宣告該變數的計數器需要上升到5。這變成了對編譯器的請求,即計數器能夠保存5。如果碰巧計數器可以容納255,那很好。您不打算將計數器提高那么高,因此您的代碼將在該最大值下正常運行。
看看構造的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://www.uj5u.com/caozuo/399907.html
