Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update dependencies #125

Merged
merged 1 commit into from
May 18, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 33 additions & 14 deletions print-foobar-alternately/BlockingQueue.ixx
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ export module leetcode_test.print_foobar_alternately.BlockingQueue;
using namespace std;
namespace leetcode_test::print_foobar_alternately {

export template <class E> class BlockingQueue {
export template <class E>
class BlockingQueue {

private:
private:
queue<E> _queue;
int capacity = INT_MAX;
condition_variable takeVariable, putVariable;
mutable mutex lock;

public:
public:
BlockingQueue();
/**
*
Expand All @@ -29,13 +30,13 @@ export template <class E> 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;

Expand All @@ -48,12 +49,18 @@ export template <class E> class BlockingQueue {
E front();
};

template <class E> BlockingQueue<E>::BlockingQueue() {}
template <class E>
BlockingQueue<E>::BlockingQueue() { }

template <class E>
BlockingQueue<E>::BlockingQueue(int capacity) : capacity(capacity) {}
BlockingQueue<E>::BlockingQueue(int capacity)
: capacity(capacity)
{
}

template <class E> int BlockingQueue<E>::take(E &e) {
template <class E>
int BlockingQueue<E>::take(E& e)
{
unique_lock<mutex> uniqueLock(lock);
while (_queue.empty()) {
takeVariable.wait(uniqueLock);
Expand All @@ -66,7 +73,9 @@ template <class E> int BlockingQueue<E>::take(E &e) {
return 0;
}

template <class E> int BlockingQueue<E>::put(const E &e) {
template <class E>
int BlockingQueue<E>::put(const E& e)
{
unique_lock<mutex> uniqueLock(lock);
while (_queue.size() >= capacity) {
putVariable.wait(uniqueLock);
Expand All @@ -78,28 +87,38 @@ template <class E> int BlockingQueue<E>::put(const E &e) {
return 0;
}

template <class E> bool BlockingQueue<E>::empty() const {
template <class E>
bool BlockingQueue<E>::empty() const
{
lock_guard<mutex> lockGuard(lock);
return _queue.empty();
}

template <class E> unsigned int BlockingQueue<E>::size() const {
template <class E>
unsigned int BlockingQueue<E>::size() const
{
lock_guard<mutex> lockGuard(lock); // 利用变量作用域创建加锁,析构自动解锁
return _queue.size();
}

template <class E> void BlockingQueue<E>::pop() {
template <class E>
void BlockingQueue<E>::pop()
{
lock.lock();
_queue.pop();
lock.unlock();
}

template <class E> E BlockingQueue<E>::back() {
template <class E>
E BlockingQueue<E>::back()
{
lock_guard<mutex> lockGuard(lock);
return _queue.back();
}

template <class E> E BlockingQueue<E>::front() {
template <class E>
E BlockingQueue<E>::front()
{
lock_guard<mutex> lockGuard(lock);
return _queue.front();
}
Expand Down