/* * ===================================================================================== * * Filename: shm_queue.h * * Description: * * Version: 1.0 * Created: 2021年03月25日 10时35分09秒 * Revision: none * Compiler: gcc * * Author: Li Chao (), * Organization: * * ===================================================================================== */ #ifndef SHM_QUEUE_JE0OEUP3 #define SHM_QUEUE_JE0OEUP3 #include "shm.h" #include #include namespace bhome_shm { template using Circular = robust::CircularBuffer>; template class SharedQueue { public: SharedQueue(const uint32_t len, Allocator const &alloc) : queue_(len, alloc) {} template bool TryWrite(const D &d, const OnWrite &onWrite) { Guard lock(mutex()); if (!queue_.full()) { onWrite(d); queue_.push_back(d); return true; } else { return false; } } bool TryWrite(const D &d) { Guard lock(mutex()); return !queue_.full() ? (queue_.push_back(d), true) : false; } bool Read(D &d, const int timeout_ms) { using namespace std::chrono; auto end_time = steady_clock::now() + milliseconds(timeout_ms); do { if (TryRead(d)) { return true; } else { robust::QuickSleep(); } } while (steady_clock::now() < end_time); return false; } bool TryRead(D &d) { Guard lock(mutex()); if (!queue_.empty()) { queue_.pop_front(d); return true; } else { return false; } } private: typedef Circular Queue; Queue queue_; Mutex mutex_; Mutex &mutex() { return mutex_; } }; } // namespace bhome_shm #endif // end of include guard: SHM_QUEUE_JE0OEUP3