2011-08-01 30 views
1

ATLを使用しているフリースレッドのインプロセスCOMオブジェクトで、FinalConstruct()にのみ設定され、FinalRelease()でのみ読み込まれるメンバー変数を追加したいとします。他のコードは、そのメンバ変数を操作することはありません。FinalConstruct()/ FinalRelease()の内部で同期が必要ですか?

メンバー変数にアクセスする際に同期が必要かどうかは疑問です。私はATLソースを注意深く読んでいて、これらのメソッドは常に1回だけ呼び出されるので、1つのスレッドのみから呼び出されるように見えます。

正しい仮定ですか?同期を省略することはできますか?

答えて

3

はい、前提は正しいです。それをC++のコンストラクタとデストラクタの拡張と考えてください。理論的には、FinalRelease()が実行されている間に、別のスレッドからCOMオブジェクトのメソッドを呼び出すことができます。しかし、それは未定義の動作であり、予期される動作ではありません。デストラクタ内の他のスレッドから自分自身を保護しようとしないのと同じように、自分自身を保護しようとするべきではありません。デストラクタで自分自身を守らなければならない場合、設計は一般に壊れています(スレッド間に適切な終了プロトコルがないことを示します)。

FinalRelease()は、クライアントコードにオブジェクトの有効な参照カウントがない場合や、コードの他の部分が2回リリースされている場合にのみ使用できます。これはハードなエラーです。とにかくクラッシュする可能性があります。同期エラーが発生した場合はまったく関係ありません。オブジェクト参照カウントを管理するためのATLコードはスレッドセーフであり、競合状態を開いたままにしません。

FinalConstruct()は、FinalConstruct()が正常終了する前にオブジェクトへの参照がクライアントに返されません。

関連する問題