私はそのようなクラスではどうなるかと思った:マルチスレッド環境のデストラクタ?
class MyClass
{
private:
std::vector<int> iVector;
void Worker()
{
//Lots of stuff done with iVector
//adding, removing elements, etc.
}
}
のは、私がiVectorを使用して、それを修正する(クラスのメンバ関数の一つによって呼び出される)スレッドを作成しましょう。この作業者以外に、このクラスの他のメンバ関数は、このstd :: vectorを読み取ったり変更したりしません。
iVectorを使用しているのはワーカースレッドだけなので、すべてうまく見えます。
しかし、オブジェクトの1つのインスタンスが破棄されるとどうなりますか?ワーカースレッドの終了後にオブジェクトが破壊されても、iVectorのデストラクタはメインスレッドから呼び出されます。これは未定義の動作につながりますか?
ありがとうございます!
オブジェクトの存続期間がスレッドまたはオブジェクトの他の使用よりも長い場合、UBは存在しません。 –
ちなみに、ベクトルがスレッドだけで使用され、他の場所で使用されていない場合は、そのスレッド内のローカル変数として使用してください。次に、このようなことについても心配する必要はありません。 –
オブジェクトの存続期間は、もはやスレッドによって決まりません。しかし、それがスレッドB(ワーカースレッド)で変更されたときに、スレッドAのベクトルを破壊するのはなぜ素晴らしいですか? – sapito