如何使用包含条件变量的 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;
}
我尝试使用包含条件变量的 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;
}