优雅的互斥开关开/关开关?
Elegant mutex on/off switch for functions?
本文关键字:开关 更新时间:2023-10-16
你能想到一种优雅的方式来使用可选的互斥锁创建(成员)函数吗?出于显而易见的原因,让我们忽略宏。
当然,最简单的方法是具有两个功能:
int getIndex() const { std::lock_guard m( mtx ); return nm_getIndex(); }
int nm_getIndex() const { return _index; }
这将创建高效的代码,但它依赖于代码复制。基本上,你最终会得到两次大多数函数声明。
另一种方法是将它们转换为模板函数。布尔模板参数将用作"en-/disabler"。然后,您可以像这样调用该函数:
auto index = getIndex< NoMutex >();
每当在内部使用该函数时(否则锁定互斥锁)。这里的问题是确保即使抛出异常,互斥锁也会解锁。也就是说,你不能简单地使用类似的东西
if constexpr( MutexOn == true ) {
mutex.lock();
}
do some stuff;
if constexpr( MutexOn == true ) {
mutex.unlock();
}
我目前唯一能想到的就是围绕互斥体建立一个类,并将其放入一个联合体中。然后,该类可以"玩lock_guard"或不执行任何操作。虽然我很确定这将在发布代码中得到适当优化,但它看起来仍然很麻烦且不灵活。 因此,我想知道您是否能想到更好的东西?
谢谢!
我能想到的最简单的方法是:
-
创建一个 noop lock_guard类。
创建一个模板函数 ,该函数始终使用指定为模板参数的类型的锁保护。
当你想要一个函数的非/阻塞版本时,你可以传入noop guard
。
例如:
template<typename Guard>
int getIndex<Guard>() const { Guard m( lock ); return nm_getIndex(); }
class NoopLockGuard ; //dummy class. it does absolutely nothing
int i = getIndex<NoopLockGuard>()
int j = getIndex<std::lock_guard>()
编译器应该能够使用NoopLockGuard
优化版本,以便它会产生最小或零的性能损失。
相关文章:
- 既然存在危险,为什么项目要使用-I include开关
- 为什么这个音频包络不能通过开关的情况?
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 为什么我的开关/机箱在使用枚举时默认?
- 为什么布尔开关语句有编译器警告?
- 如何使用"equal to"以外的评估编写开关语句
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 无法找到简单的开关大小写枚举错误
- 未达到的情况会影响开关外壳性能
- C++:我的开关盒循环转到第一种情况
- 有没有办法在C++将字符串与开关语句一起使用?
- 开关:无外壳中断
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- C++ 我的开关格式中的循环不允许我显示菜单选项或接受输入?
- 如何在开关的情况下使用右值引用
- 如何在不同的开关大小写语句上使用对象的类成员函数?
- 用于验证 Visual Studio 一致性开关对生成的代码的影响的工具