gpt4 book ai didi

c++ - 在运行时选择互斥量或虚拟互斥量

转载 作者:搜寻专家 更新时间:2023-10-30 23:50:21 24 4
gpt4 key购买 nike

我有一个在多个项目之间共享的类,它的一些用途是单线程的,一些是多线程的。单线程用户不希望互斥锁的开销,多线程用户不希望自己加锁,希望能够有选择地以“单线程模式”运行。所以我希望能够在运行时在真实互斥锁和“虚拟”互斥锁之间进行选择。

理想情况下,我会有一个 shared_ptr<something>并分配一个真实的或假的互斥对象。然后我会“锁定”它而不考虑它里面有什么。

unique_lock<something> guard(*mutex);
... critical section ...

现在有一个signals2::dummy_mutex但它不与 boost::mutex 共享公共(public)基类.

那么,在不使锁定/保护代码比上面的示例更复杂的情况下,在真正的互斥锁和虚拟互斥锁(signals2 中的互斥锁或其他东西)之间进行选择的优雅方法是什么?

并且,在您指出替代方案之前:

  • 我可以在编译时选择一个实现,但预处理器宏很难看,维护项目配置对我们来说很痛苦。
  • 多线程环境中类的用户不想承担锁定类使用的责任,而是让类在内部进行自己的锁定。
  • “线程安全包装器”涉及的 API 和现有用法太多,无法成为实用的解决方案。

最佳答案

这样的事情怎么样?它未经测试,但应该接近确定。您可能会考虑让模板类保存一个值而不是一个指针如果您的互斥体支持正确的结构类型。否则,您可以专门化 MyMutex 类以获得值(value)行为。

此外,它在复制或销毁时也不小心。我把它留给读者作为练习;)(shared_ptr 或存储一个值而不是指针应该可以解决这个问题)

哦,代码使用 RAII 而不是显式锁定/解锁会更​​好...但这是一个不同的问题。我假设这就是代码中 unique_lock 的作用?

struct IMutex
{
virtual ~IMutex(){}
virtual void lock()=0;
virtual bool try_lock()=0;
virtual void unlock()=0;
};

template<typename T>
class MyMutex : public IMutex
{
public:
MyMutex(T t) : t_(t) {}
void lock() { t_->lock(); }
bool try_lock() { return t_->try_lock(); }
void unlock() { t_->unlock(); }
protected:
T* t_;
};

IMutex * createMutex()
{
if( isMultithreaded() )
{
return new MyMutex<boost::mutex>( new boost::mutex );
}
else
{
return new MyMutex<signal2::dummy_mutex>( new signal2::dummy_mutex );
}
}


int main()
{
IMutex * mutex = createMutex();
...
{
unique_lock<IMutex> guard( *mutex );
...
}

}

关于c++ - 在运行时选择互斥量或虚拟互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2181594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com