通过使用覆盖操作员的代理来同步对象
Synchronizing an object by using a proxy that overrides operator->
我有一些可以从多个线程访问的对象,需要同步。
我想要的解决方案涉及创建一个代理类,覆盖其operator->
,并锁定对operator->
的调用。这大约是我想要的:
template <typename T>
class SynchronizedObject<T> {
lock_t l;
public:
??? operator->() {
lock(l);
// do the operation
unlock(l);
}
};
因此,例如,我可以轻松地制作一个同步向量,例如SynchronizedObject<std::vector>
,并打电话给push_back
等。
但是,当我进行了一些研究时,这并不是operator->
的过载的工作方式,因为在我的示例中,它需要返回T*
,只有在返回后,只有在返回后,请致电push_back
或任何方法我'我感兴趣。有什么办法可以实现我想要的,而无需访问宏地狱?
这是一个概念证明,它利用operator ->
的递归行为透明地插入锁定代理。代理是不可移动的,不可分配的,因此不能意外存储(或者您确实必须是指)。
#include <iostream>
template <class T>
struct LockedPtr {
LockedPtr(T *_t) {
std::cout << "lockn";
}
~LockedPtr() {
std::cout << "unlockn";
}
LockedPtr(LockedPtr const &) = delete;
LockedPtr &operator = (LockedPtr const &) = delete;
T* operator -> () {
return _t;
}
private:
T *_t;
};
template <class T>
struct LockWrapper {
LockedPtr<T> operator -> () {
return {&_t};
}
private:
T _t;
};
struct DummyContainer {
void push_back(int i) {
std::cout << "push_back(" << i << ")n";
}
};
int main() {
LockWrapper<DummyContainer> lv;
lv->push_back(1);
lv->push_back(2);
lv->push_back(3);
}
输出:
lock
push_back(1)
unlock
lock
push_back(2)
unlock
lock
push_back(3)
unlock
相关文章:
- 代理对象的常量正确性
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 具有所表示类的相同构造函数签名的代理类模板
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 线程过程中的线程同步问题
- 我如何知道QNetWorkReped来自哪个代理?
- 通过使用覆盖操作员的代理来同步对象