我有這樣的方式來實現一個多線程的C++類:重構多線程類爲單線程+多線程
class MyClass{
protected:
somemutex mutex;
void _unsafeMethod(){...};
public:
void safeMethod{
locker lock(mutex);
_unsafeMethod();
}
}
我很高興的是,但注意到,在大多數情況下,在多線程支持ISN沒有必要,所以我很樂意把它分成兩類:一個是線程安全的,一個是不安全的,但是表現更好。
問題是,有成千上萬行代碼使用該類,所以我需要保持界面相同。當然,根據是否需要支持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();
};
}
這第二個解決方案看起來髒兮兮的,總有一個「如果」在每次調用來解決。
您認爲哪種解決方案更高效?你有沒有更好的/更清潔/更有效的解決方案?
非常感謝!
爲什麼不將互斥量作爲參數傳遞給構造函數?這樣你可以選擇任意數量的鎖定機制。 – 2013-04-09 13:56:51