私は物理エンジンを作成しようとしています(楽しみのため)、私はマルチスレッド化したいと思います。
私はミューテックスの基本を理解しています(1つのスレッドは、一度にガーディングするリソースを変更できますが、スレッドレベルではなくクラスレベルであるなど)。私はメンバ変数のためにアトミックを使用しない方が望ましいです(複雑な操作を行っている場合は、実行の途中で変更されないようにするか、単に変数をコピーすることをお勧めします) )。あるスレッドで複数のオブジェクトをロックするにはどうすればよいですか?
この概念に続いて、(簡体字)Vectorクラスは、次のようになります。
class vector
{
float x_, y_;
std::mutex guard_;
};
私はそれを使用したい場合は、どのように彼らはロックされなければなりませんか?
void foo(vector v1, vector v2)
{
std::lock_guard<std::mutex>(v1.guard_);
std::lock_guard<std::mutex>(v2.guard_);
// Do stuff with v1 and v2...
}
このようにしますか?これは実際に両方のオブジェクトを保護しますか?
TL; DR複数のオブジェクトが同じスレッドで操作されている場合、どのようにmutexをロックするべきですか? (アトミックやコピーを使用しないで)
は、オブジェクトにアクセスするすべてのコードは、使用する前にそれらをロックと仮定して、よさそうです。 [デッドロック](https://en.wikipedia.org/wiki/Deadlock)に注意してください。これは、複数のオブジェクトをロックするときによく発生します。 – hnefatl
ミューテックスはおそらく2つの 'float'と同じくらい大きいので、コピーに基づいていくつかの仮説的解決法に比べてメモリを節約しているとは限りません。 –
ミューテックスは、オブジェクト(変数)ではなくコードパスを保護します。これは、1つ以上のコードパスを保護するサイズ効果です。 –