我相信我至少对 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)会有好处吗?