私は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
@Rollieはい、私はオブジェクトが共有されることを意味しました。だから、私が作成する場合: – Brett
@Rollie:破壊中のクラスへのアクセスは、インスタンスのライフタイム管理のバグです。プログラムはすでに破損しているときに破損しています(破棄中にアクセスできる場合、 )。 –