如何创建类似于boost::lock_guard的保护
how to create guard similar to boost::lock_guard
我想创建一个守卫,它在构造时锁定函数,在销毁时解锁它,例如用false
和true
调用函数。
class A {
void enable( bool flag );
};
在另一个方法中,我想使用:
A::anotherMethod( ... ) {
block_guard(A::enable); // now A::enable(false)
// some operation
} // now A::enable(true)
我的想法:
使用模板template < class T >
class block_guard {
T t_;
public:
block_guard( T& t ) : t_(t) {
t_(false);
}
~block_guard() {
t_(true);
}
};
的问题是,如何实例化模板?也许用boost::bind
?
使用boost::函数
class block_guard {
typedef boost::function< void (bool) > T;
T t_;
public:
block_guard( T& t ) : t_(t) {
t_(false);
}
~block_guard() {
t_(true);
}
};
这工作得很好,但是调用
似乎非常复杂。block_guard bg(boost::function< void (bool) >(boost::bind(&A::enable, pointer-to-A, _1));
任何想法?也许还有另一种更简单的方法?
首先,认识到成员函数并不是您所需要的全部;您还需要调用它的对象。在c++中,在函数中创建的对象没有办法隐式地捕获当前的this
指针。
我假设你没有可用的c++ 11。如果需要,使用第二个解决方案和lambda表达式是最简单的。
现在,如果您不关心boost::函数对性能的轻微影响(您不应该关心),第二个解决方案是好的,但是我会稍微修改它,通过将绑定拉入构造函数使其更方便使用。
class block_guard {
typedef boost::function< void (bool) > block_fn;
block_fn block_fn_;
public:
// For non-member functions and function objects:
template <typename Fn>
block_guard(Fn fn) : block_fn_(fn) {
block_fn_(false);
}
// For member functions:
template <typename T, typename Ret>
block_guard(T* obj, Ret (T::*fn)(bool)) : block_fn_(boost::bind(fn, obj, _1)) {
block_fn_(false);
}
~block_guard() {
block_fn_(true);
}
};
用法:
block_guard guard(this, &A::enable);
我在这里使用了一个Ret形参,因为没有理由不允许函数返回一些东西——返回值将被简单地忽略。
如果你不想要boost::function,这个东西将变得不那么容易使用,因为你必须模板块保护。因此,为成员函数专门创建一个block_guard就变得很有用了。你也失去了使用非void函数的能力。
template <typename T>
class block_guard {
typedef void (T::*block_fn)(bool);
T* obj_;
block_fn block_fn_;
public:
block_guard(T* obj, block_fn fn) : obj_(obj), block_fn_(fn) {
(obj_->*block_fn_)(false);
}
~block_guard() {
(obj_->*block_fn_)(true);
}
};
用法:
block_guard<A> guard(this, &A::enable);
是的,有一个更简单的方法,忘记模板、通用的东西和任何不必要的东西,专注于任务。
你所需要的只是一个有一个actor和一个doctor的类。先给医生写信,这能让你知道你需要做什么。然后编写该actor,根据需要获取参数。最后,删除不需要的函数(cctor, op=)。做。
不是通用的,但直截了当。
相关文章:
- 尝试构建"lock-free"数据结构C++
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- "lock cmpxchg"如何在装配中工作?
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 使用Mutex,lock_guard,在课堂中正确地lock
- 我什么时候不希望在Visual Studio中启用“Control Flow Guard Microsoft
- 正在解锁手动未定义/不良设计的锁定guard
- 当我调用lock()时,为什么std :: mutex会引发异常
- clang-tidy llvm-header-guard目录配置
- mutex.lock vs unique_lock
- 使用 std::lock (c++11) 的大量 CPU 负载
- 我是否必须使用neak_ptr.lock()只是为了测试它是否指向有效的对象
- std::lock() equivalent for boost::shared_mutex?