C++實現安全佇列
阿新 • • 發佈:2020-09-01
```cpp #ifndef SAFEQUEUE #define SAFEQUEUE #include <iostream> #include <queue> #include <thread> #include <mutex> #include <condition_variable> using namespace std; template<typename T> class SafeQueue { public: SafeQueue() {} ~SafeQueue() {} void InitQueue() { work = 1; } void EnQueue(T value) { lock_guard<mutex> lock(mt); if (work) { q.push(value); cv.notify_one(); } } void Print() { lock_guard<mutex> lock(mt); queue<T> copy_queue = q; while (!q.empty()) { copy_queue.push(q.front()); q.pop(); } while (!copy_queue.empty()) { std::cout << copy_queue.front() << std::endl; copy_queue.pop(); } } int DeQueue(T& value) { int ret = 0; //佔用空間相對lock_guard 更大一點且相對更慢一點,但是配合條件必須使用它,更靈活 unique_lock<mutex> lock(mt); //第二個引數 lambda表示式:false則不阻塞 往下走 cv.wait(lock, [this] {return !work || !q.empty(); }); if (!q.empty()) { value = q.front(); q.pop(); ret = 1; } return ret; } void setWork(int work) { lock_guard<mutex> lock(mt); this->work = work; } void Clear() { lock_guard<mutex> lock(mt); while (!q.empty()) { q.pop(); } } int Find(T value) { return nullptr; } private: mutex mt; condition_variable cv; queue<T> q; //是否工作的標記 1 :工作 0:不接受資料 不工作 int work; }; #endif //SAFEQUEUE