我有一个在多个项目之间共享的类,它的一些用途是单线程的,有些是多线程的。单线程用户不希望互斥锁的开销,而多线程用户不希望自己进行锁定,希望能够选择性地以“单线程模式”运行。所以我希望能够在运行时在真实和“虚拟”互斥锁之间进行选择。
理想情况下,我将拥有一个shared_ptr<something>
并分配一个真实或虚假的互斥对象。然后我会“锁定”它而不考虑里面有什么。
unique_lock<something> guard(*mutex);
... critical section ...
现在有一个signals2::dummy_mutex
,但它不与 . 共享一个公共基类boost::mutex
。
那么,在不使锁定/保护代码比上面的示例更复杂的情况下,在真正的互斥锁和虚拟互斥锁(信号 2 中的一个或其他)之间进行选择的优雅方法是什么?
而且,在您指出替代方案之前:
- 我可以在编译时选择一个实现,但是预处理器宏很难看,维护项目配置对我们来说很痛苦。
- 多线程环境中的类用户不想承担锁定类使用的责任,而不是让类在内部进行自己的锁定。
- “线程安全包装器”涉及的 API 和现有用法太多,无法成为实用的解决方案。