1
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 个问题

  1. 在 push 函数中, lock.unlock() 在 _cond notify_one() 之前;这是必要的吗,因为当函数返回时,储物柜超出范围并释放互斥锁。必须在通知之前吗?
  2. 为什么 pop() 中的条件 lambda 函数是按值传递的?
4

0 回答 0