我相信我已經很好地掌握了C++中多線程的基礎知識,但是我一直無法得到關於在共享資源周圍鎖定互斥體的明確答案在構造函數或析構函數中。我的印象是你應該鎖定在兩個地方,但最近同事不同意。在構造函數和析構函數中鎖定共享資源
class TestClass
{
public:
TestClass(const float input) :
mMutex(),
mValueOne(1),
mValueTwo("Text")
{
//**Does the mutex need to be locked here?
mValueTwo.Set(input);
mValueOne = mValueTwo.Get();
}
~TestClass()
{
//Lock Here?
}
int GetValueOne() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueOne(const int value)
{
Lock(mMutex);
mValueOne = value;
}
CustomType GetValueTwo() const
{
Lock(mMutex);
return mValueOne;
}
void SetValueTwo(const CustomType type)
{
Lock(mMutex);
mValueTwo = type;
}
private:
Mutex mMutex;
int mValueOne;
CustomType mValueTwo;
};
當然一切都應該是通過初始化列表安全的,但對於構造函數中的語句:假裝以下類是由多個線程訪問?在析構函數中,執行非範圍鎖定會有好處,並且永遠不會解鎖(本質上只是調用pthread_mutex_destroy)?
當你說的「類」是在多個線程之間使用,我假設你的意思是TestClass類型的對象可能在多個線程中使用。在這種情況下,你仍然只創建一個對象,所以你不需要在構造函數中鎖定。如果兩個線程同時在構造函數中,則它們將創建2個獨立的對象。鎖定對象構造更合理,以確保(例如)在對象完成構建之前不使用mValueTwo。析構函數似乎應該鎖定,以確保數據在被銷燬時不被訪問。 – Rollie 2012-07-25 15:09:45
@Rollie是的,我確實認爲這個對象是共享的。所以,如果我創建了: – Brett 2012-07-25 15:17:32
@Rollie:在破壞的時候訪問類是一個帶有實例生命週期管理的錯誤 - 當發生這種情況時程序已經被破壞(如果它可以在破壞時被訪問,它也可能在事後發生)。 – 2012-07-25 15:18:18