如何使用包含条件变量的 class 插入到向量中?

How can I insert into vector with a class including condition variable?

我尝试使用包含条件变量的 class 插入到向量中,我的代码如下:

class LockRequest {
   public:
    LockRequest( ) : granted_(false) {}
    bool granted_;
  };

  class LockRequestQueue {
   public:
    std::list<LockRequest> request_queue_;
    std::condition_variable cv_;  // for notifying blocked transactions on this rid
    bool upgrading_ = false;
  };

int main(){
    LockRequestQueue request;
    std::vector<LockRequestQueue> vecs;
    vecs.push_back(request);
    return 0;
}

但是我得到 error.When 我删除了条件变量 cv_,结果是 correct.How 我可以解决这个问题吗??

std::condition_variable 不是

  • 复制构造,
  • 移动可构造的,
  • 复制可分配或
  • 移动可分配。

因此,将其直接添加到任何 class 作为成员也会将这些资格添加到 class
为了避免这种情况,我们使用了额外的间接级别,例如 std::unique_ptr 来保存指向它的指针。

class LockRequestQueue {
public:

    LockRequestQueue() // make a condition variable and assign it to the unique_ptr
        :cv_(std::make_unique<std::condition_variable>())
    {}

    std::list<LockRequest> request_queue_;
    std::unique_ptr<std::condition_variable> cv_;  //notice the unique_ptr
    bool upgrading_ = false;
};

现在,在我们的 main() 函数中,我们使用 std::move 推送到向量,因为 std::unique_ptr 本身不可复制构造:

int main()
{

    LockRequestQueue request;
    std::vector<LockRequestQueue> vecs;
    vecs.push_back(std::move(request)); //notice the std::move
    return 0;
}