為什么std::barrier在堆上分配記憶體而std::latch沒有?
它們之間的主要區別在于std::barrier可以重用而std::latch不能重用,但我找不到解釋為什么這會使前者分配記憶體。
uj5u.com熱心網友回復:
雖然可以使用作為物件的一部分的恒定存盤量來實作一個簡單的std::barrier屏障,但現實世界的屏障實作使用具有 > O(1) 存盤的結構,但具有更好的并發屬性。
例如,gcc libstdc 實作使用樹屏障,這避免了大量執行緒在同一個計數器上競爭。當使用樸素屏障釋放執行緒時,這種爭用會導致 O(N) 性能,而樹屏障可以在對數時間內傳播“屏障完成,釋放時間”信號,代價是需要線性空間來表示執行緒樹.
不難想象增強的樹型屏障實作意識到快取/套接字/記憶體總線層次結構,并根據其物理位置對樹中的執行緒進行分組,以最大限度地減少跨核、跨芯片和跨套接字輪詢到最低要求。
另一方面,我不太確定為什么會禁止分配鎖存器 - cppreference狀態The latch class is a downward counter of type std::ptrdiff_t表明它是這樣的(即它只是一個計數器并且沒有空間來保存指向已分配物件的指標),但是[thread.latch]只是說“一個鎖存器維護一個在創建鎖存器時初始化的內部計數器”,而不禁止它維護其他東西。從設計的角度來看,它看起來確實是一個更小、更輕量級的同步工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496624.html
