Unbounded queue
Summary: UnboundedQueue supports: - SPSC, MPSC, SCMP, MPMC - Non-waiting, waiting, and timed consumer operations. - Producers never wait or fail (unless out-of-memory). - Memory usage grows and shrinks dynamically ``` /// UnboundedQueue supports a variety of options for unbounded /// dynamically expanding an shrinking queues, including variations of: /// - Single vs. multiple producers /// - Single vs. multiple consumers /// - Blocking vs. spin-waiting /// - Non-waiting, timed, and waiting consumer operations. /// Producer operations never wait or fail (unless out-of-memory). /// /// Template parameters: /// - T: element type /// - SingleProducer: true if there can be only one producer at a /// time. /// - SingleConsumer: true if there can be only one consumer at a /// time. /// - MayBlock: true if consumers may block, false if they only /// spins. A performance tuning parameter. /// - LgSegmentSize (default 8): Log base 2 of number of elements per /// segment. A performance tuning parameter. See below. /// /// When to use UnboundedQueue: /// - If a small bound may lead to deadlock or performance degradation /// under bursty patterns. /// - If there is no risk of the queue growing too much. /// /// When not to use UnboundedQueue: /// - If there is risk of the queue growing too much and a large bound /// is acceptable, then use DynamicBoundedQueue. /// - If the queue must not allocate on enqueue or it must have a /// small bound, then use fixed-size MPMCQueue or (if non-blocking /// SPSC) ProducerConsumerQueue. /// /// Template Aliases: /// USPSCQueue<T, MayBlock, LgSegmentSize> /// UMPSCQueue<T, MayBlock, LgSegmentSize> /// USPMCQueue<T, MayBlock, LgSegmentSize> /// UMPMCQueue<T, MayBlock, LgSegmentSize> /// /// Functions: /// Producer operations never wait or fail (unless OOM) /// void enqueue(const T&); /// void enqueue(T&&); /// Adds an element to the end of the queue. /// /// Consumer operations: /// void dequeue(T&); /// Extracts an element from the front of the queue. Waits /// until an element is available if needed. /// bool try_dequeue(T&); /// Tries to extracts an element from the front of the queue /// if available. Returns true if successful, false otherwise. /// bool try_dequeue_until(T&, time_point& deadline); /// Tries to extracts an element from the front of the queue /// if available until the specified deadline. Returns true /// if successful, false otherwise. /// bool try_dequeue_for(T&, duration&); /// Tries to extracts an element from the front of the queue /// if available for for the specified duration. Returns true /// if successful, false otherwise. /// /// Secondary functions: /// size_t size(); /// Returns an estimate of the size of the queue. /// bool empty(); /// Returns true only if the queue was empty during the call. /// Note: size() and empty() are guaranteed to be accurate only if ``` Reviewed By: djwatson Differential Revision: D6157613 fbshipit-source-id: db423f86d1d0604d22f6b9c71ea0ed08be32e2a1
Showing
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Please register or sign in to comment