template <typename T>
class BlockingQueue{
private:
queue<T> _queue;
mutex _mutex;
condition_variable _cond;
public:
void push( const T& item){
unique_lock<mutex> locker(_mutex);
_queue.push(item);
locker.unlock();
_cond.notify_one();
}
T pop(){
unique_lock<mutex> locker(_mutex);
_cond.wait(locker, [=](){ return !_queue.empty() ;} ); //lambda function, capture by value
T item = _queue.front();
_queue.pop();
return item;
}
};
所以这是一个阻塞队列的实现。我有 2 个问题
- 在 push 函数中, lock.unlock() 在 _cond notify_one() 之前;这是必要的吗,因为当函数返回时,储物柜超出范围并释放互斥锁。必须在通知之前吗?
- 为什么 pop() 中的条件 lambda 函数是按值传递的?