diff --git a/print-foobar-alternately/BlockingQueue.ixx b/print-foobar-alternately/BlockingQueue.ixx index f40209cc..7d3f028d 100644 --- a/print-foobar-alternately/BlockingQueue.ixx +++ b/print-foobar-alternately/BlockingQueue.ixx @@ -9,15 +9,16 @@ export module leetcode_test.print_foobar_alternately.BlockingQueue; using namespace std; namespace leetcode_test::print_foobar_alternately { -export template class BlockingQueue { +export template +class BlockingQueue { - private: +private: queue _queue; int capacity = INT_MAX; condition_variable takeVariable, putVariable; mutable mutex lock; - public: +public: BlockingQueue(); /** * @@ -29,13 +30,13 @@ export template class BlockingQueue { * @param e * @return -1失败, 0成功 */ - int take(E &e); + int take(E& e); /** * size >= capacity时会阻塞 * @param e * @return */ - int put(const E &e); + int put(const E& e); bool empty() const; @@ -48,12 +49,18 @@ export template class BlockingQueue { E front(); }; -template BlockingQueue::BlockingQueue() {} +template +BlockingQueue::BlockingQueue() { } template -BlockingQueue::BlockingQueue(int capacity) : capacity(capacity) {} +BlockingQueue::BlockingQueue(int capacity) + : capacity(capacity) +{ +} -template int BlockingQueue::take(E &e) { +template +int BlockingQueue::take(E& e) +{ unique_lock uniqueLock(lock); while (_queue.empty()) { takeVariable.wait(uniqueLock); @@ -66,7 +73,9 @@ template int BlockingQueue::take(E &e) { return 0; } -template int BlockingQueue::put(const E &e) { +template +int BlockingQueue::put(const E& e) +{ unique_lock uniqueLock(lock); while (_queue.size() >= capacity) { putVariable.wait(uniqueLock); @@ -78,28 +87,38 @@ template int BlockingQueue::put(const E &e) { return 0; } -template bool BlockingQueue::empty() const { +template +bool BlockingQueue::empty() const +{ lock_guard lockGuard(lock); return _queue.empty(); } -template unsigned int BlockingQueue::size() const { +template +unsigned int BlockingQueue::size() const +{ lock_guard lockGuard(lock); // 利用变量作用域创建加锁,析构自动解锁 return _queue.size(); } -template void BlockingQueue::pop() { +template +void BlockingQueue::pop() +{ lock.lock(); _queue.pop(); lock.unlock(); } -template E BlockingQueue::back() { +template +E BlockingQueue::back() +{ lock_guard lockGuard(lock); return _queue.back(); } -template E BlockingQueue::front() { +template +E BlockingQueue::front() +{ lock_guard lockGuard(lock); return _queue.front(); }