マルチスレッド環境で使用される静的 (シングルトン) クラスがあります。コンストラクターおよびその他の mrmber 関数でミューテックスを使用します。ただし、デストラクタ用のミューテックスはありません。デストラクタは、他のメンバーオブジェクトのクリーンアップなどのタスクを実行します。ディスストラクタでもミューテックスが必要ですか?
4 に答える
デストラクタが破壊しているオブジェクトにアクセスするという点では、いいえ、ミューテックスを使用すべきではありません。呼び出しコードは、デストラクタが一度だけ呼び出されるようにする責任があります。それはデストラクタの責任ではありません。
他のデータやリソースへのアクセスに関しては、デストラクタからそれらにアクセスすることに特別なことはありません。このデストラクタから呼び出された場合でも、通常の関数から呼び出された場合でも、同じようにミューテックスで保護する必要がある場合とない場合があります。
デイブがデストラクタに与えるのと同じ理論的根拠がコンストラクタに適用されます。オブジェクトがまだ構築されている間は、他のスレッドからアクセスしないでください。コンストラクターは1つのスレッドによってのみ実行されることが保証されています(2回構築することはできません)が、完全に構築される前に、スレッドがオブジェクトにアクセスしないことを保証する必要があります。
内部ロックは、データアクセスのコンストラクタまたはデストラクタの責任であってはなりません。これらは、スレッド同期のデストラクタで使用できます。オブジェクトがすでにオブジェクト内にある場合(スレッドがオブジェクトメソッドの1つを実行している場合)、操作の途中でオブジェクトを削除しないことを保証します。
これは、言語の意味で使用されるコンストラクタとデストラクタを備えたすべてのタイプのクラスの一般的なレシピです。さて、シングルトンでは、シナリオはもう少し具体的です。通常、シングルトンのコンストラクターについて話すときは、実際にはオブジェクトを作成する静的メソッドについて話しますが、実際のコンストラクターについては話しません。その静的メソッドには通常、静的ミューテックスを含めることができる同期メカニズムがあります。
シングルトンの破壊とは何かについての議論を深める前に、使用目的を述べる必要があります。シングルトンは、アプリケーションの存続期間中に何度も破棄および再作成されますか?それは一度作成され、永遠に生きますか?シングルトンをどのように実装していますか?これらの質問は、同期プリミティブが必要かどうか、いつ、どこで必要かを決定するための開始点です。
オブジェクトを削除しようとする複数のスレッドがある場合、デザインは深刻に間違っています。
複数のオブジェクトがインスタンスを要求することは理にかなっているため、一意のインスタンスを提供するメンバー関数でのみ同期を使用する必要がありますが、オブジェクトを削除して使用しないことを決定したポイントは1つだけである必要があります。
デストラクタが一部のグローバルデータ(グローバルカウンタなど)または一部の共有リソースを変更する場合は、ミューテックスが必要です。それ以外の場合、デストラクタ自体を保護することは、その設計上の問題を意味します。オブジェクトが他のスレッドによって使用されているときに、スレッドがオブジェクトを削除しようとすることはありません。