私は、レガシーコードを通過し、以下のスニペットが見つかりました:それはデストラクタを守るために万が一のに役立ちますデストラクタはスレッドセーフであるべきですか?
MyClass::~MyClass()
{
EnterCriticalSection(&cs);
//Access Data Members, **NO Global** members are being accessed here
LeaveCriticalSection(&cs);
}
を私は疑問に思って?
は、シナリオを検討してください。
1. Thread1 - About to execute any of the member function which uses critical section
2. Thread2- About to execute destructor.
実行の順序は、1 => 2、それがうまくいくかもしれないの場合。しかし、もし注文が逆転すればどうなるでしょうか?
デザイン上の問題ですか?
スレッドセーフである必要がありますか?クラスが「2度破壊される」可能性はありますか? –
@TomášZato:いいえ。(些細ではないデストラクタを持つ)クラスが「2回破壊された」場合、スレッドセーフな方法で発生するかどうかは問われません。いずれにしてもUBです。 – MikeMB
答えの年齢にもかかわらず、私は同意しません。メンバ変数が、dtorが呼び出されるスレッド以外のスレッドによって変更されている場合は、同期を適用する必要があります。しかし、それは「クリティカルセクション」である必要はありません。必要なのは、2つのスレッド間に「同期」関係があるということです。スレッドが同じでない限り、どちらのスレッドでも適切なメモリバリアが必要になることがあります。 – CouchDeveloper