我有一个以这种方式实现的多线程 c++ 类:
class MyClass{
protected:
somemutex mutex;
void _unsafeMethod(){...};
public:
void safeMethod{
locker lock(mutex);
_unsafeMethod();
}
}
我对此很满意,但注意到在大多数情况下,多线程支持并不是真正必要的,所以我很想将它分成 2 个类:一个线程安全的,一个不安全的,但性能更好的一个。
问题是,有成千上万行代码使用这个类,所以我需要保持接口相同。当然,类名的定义会有所变化,这取决于它是否需要支持 MT。
我想到了以下内容:
解决方案 A
class MyClass{
protected:
void _unsafeMethod(){...};
public:
virtual void safeMethod{
_unsafeMethod()
};
};
class MyThreadSafeClass: public MyClass{
protected:
somemutex mutex;
public:
virtual void safeMethod{
locker lock(mutex);
_unsafeMethod();
};
}
这里的问题是虚函数调用:它是否使执行速度变慢,所以我立即失去了单线程类性能改进的好处?从第一次测试开始,它看起来像
解决方案 B
class MyClass{
protected:
somemutex * pmutex;
void _unsafeMethod(){...};
public:
MyClass( bool isthreadsafe ){
if( isthreadsafe )
pmutex = new somemutex();
else
pmutex = NULL;
};
void safeMethod{
if( pmutex )
{
locker lock(*pmutex);
_unsafeMethod();
}
else
_unsafeMethod();
};
}
第二个解决方案看起来很脏,每次调用中总是有一个“如果”要解决。
您认为哪种解决方案更有效?您是否有更好/更清洁/性能更高的解决方案?
非常感谢!