c++ - 使用条件变量的 C++ 监视类/包装器
问题描述
我试图W
在 C++ 中创建一个包装类,它是用指向通用对象的指针构造的OBJ
。
当您通过 调用其中一个OBJ
方法时W
,W
(包含条件变量cv
)会发出一个cv.wait()
调用前OBJ
方法和一个cv.notify()
何时OBJ
方法完成。
我已经能够通过继承特定类来做到这一点,但想要一种像上面描述的通用方法。
这是继承方法:
struct A
{
virtual void foo(int i) { bar = i; };
int bar;
};
struct B : public A
{
void foo2(int i)
{
cv.wait(lck);
this->foo(i);
cv.notify_one();
}
std::condition_variable cv;
std::unique_lock<std::mutex> lck;
};
我想要类似的东西:
template<class T>
struct C
{
C(T *t) : t(t) {}
T *operator->()
{
cv.wait(lck);
return t;
// notify_one when function has completed
}
T *t;
std::condition_variable cv;
std::unique_lock<std::mutex> lck;
};
我只使用锁找到了答案(但这并不是真正的监视器):https ://stackoverflow.com/a/48408987
解决方案
这是一个工作示例:
#include <iostream>
#include <mutex>
template<class T>
class Wrapper {
std::mutex m;
T* p;
public:
Wrapper(T& t) : p(&t) {}
class Proxy {
std::unique_lock<std::mutex> lock;
T* p;
public:
Proxy(std::mutex& m, T* p)
: lock(m)
, p(p)
{
// Locked the mutex.
std::cout << __PRETTY_FUNCTION__ << '\n';
}
Proxy(Proxy&& b) = default;
~Proxy() {
std::cout << __PRETTY_FUNCTION__ << '\n';
// Unlocked the mutex.
}
T* operator->() const { return p; }
};
Proxy operator->() { return Proxy(m, p); }
};
struct A {
void f() { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
int main() {
A a;
Wrapper<A> w(a);
w->f();
}
输出:
Wrapper<T>::Proxy::Proxy(std::mutex&, T*) [with T = A]
void A::f()
Wrapper<T>::Proxy::~Proxy() [with T = A]
有关完整详细信息,请参阅Bjarne Stroustrup 的 Wrapping C++ Member Function Calls 。
推荐阅读
- excel - 无法为 VBA/Excel 逐行绘制折线图
- antlr4 - ANTLR4 - 如何更改源代码并将其取回?
- python - 如果 pip3 在安装后无法正常工作,我该如何解决?
- amazon-web-services - AWS ETL 作业创建一个新列,该列是现有列的子字符串
- javascript - 什么时候必须在 useReducer 中使用扩展运算符?
- shopify - 按产品 SKU 对集合页面进行排序?
- reactjs - 升级reactjs后无法构建三星node_modules/babel-preset-react-app/index.js$0的未知版本4
- pandas - 从具有分组列的数据框中获取随机样本?
- javascript - 调用不带括号的函数?
- python - Python中的MongoDB:从聚合查询的结果中获取特定值