我想創建一個物理引擎(只是爲了好玩),我希望它是多線程的。
我瞭解互斥體的基本知識(只有一個線程可以修改它一次監視的資源,它們應該是在一個級別而不是線程級別等)。我寧願不使用原子的成員變量(所以如果我正在對它們進行復雜的操作,它們不會在執行過程中正確地更改),或者只是簡單地複製這些變量(希望能夠降低內存佔用量)。某人如何在一個線程中鎖定多個對象?
按照這個概念,(簡化)載體類可能是這樣的:
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當多個對象被同一個線程操作時,應該如何鎖定互斥鎖? (不使用原子或製作副本)
看起來不錯,假設所有訪問對象的代碼使用前鎖定他們。警惕[死鎖](https://en.wikipedia.org/wiki/Deadlock),這在鎖定多個對象時經常發生。 – hnefatl
請注意,互斥量可能與兩個「浮點數」一樣大,所以相對於基於複製的某些假設解決方案,您可能不會節省內存。 –
互斥量保護代碼路徑不是對象(變量) - 這是保護一個或多個代碼路徑的尺寸效應。 –