2016-09-16 45 views
4

考慮:虛假的防護成員變量共享?

class Vector 
{ 
    double x, y, z; 
    // … 
}; 

class Object 
{ 
    Vector Vec1, Vec2; 
    std::mutex Mtx1, Mtx2; 

    void ModifyVec1() { std::lock_guard Lock(Mtx1); /* … */ } 
    void ModifyVec2() { std::lock_guard Lock(Mtx2); /* … */ } 
}; 

如果兩個互斥或看守變量連續存儲和緩存,當他們共享一個緩存行,可這會導致一種「交鎖」的?

如果是這樣,那麼在它們保護的變量之後(或之前)聲明互斥鎖是否是一種好的做法?

調整類到std::hardware_destructive_interference_sizeP0154)可能會避免這種影響。潛在的益處是否值得物體的整體排列?

+0

C++標準不要求類成員按任何特定順序進行佈局(有些注意事項在此不適用)。您可以從編譯器的文檔中確定它是否對類成員使用確定性順序(可能)。 –

+3

@SamVarshavchik對於標準佈局類,它們必須處於聲明順序中,並且根據到目前爲止發佈的內容,這可能是標準佈局類。另外,這並不重要,因爲OP詢問特定實現的細節 –

+0

@ Rakete1111請隨時編輯 – metalfox

回答

3

你的變量似乎在你的問題無關,所以不是hardware_destructive_interference_size你可能想hardware_constructive_interference_size

struct keep_together { 
    std::mutex m; 
    Vector v; 
}; 

alignas(std::hardware_constructive_interference_size) keep_together k1; 
alignas(std::hardware_constructive_interference_size) keep_together k2; 

destructive要使用像無鎖隊列的情況下,是線程讀取兩個不同atomic S和你想確保它們實際上都被加載。如果這是一個問題,那麼您需要解釋爲什麼虛假分享是您要避免的。

爲了增加它們在同一緩存行上的機會,在變量保護後(或之前)聲明互斥鎖是否是一種很好的做法?

這就是constructive干擾。

+0

感謝您的澄清。我混合了這兩個概念。我希望鼓勵真正的分享,但如果可能發生,也會阻止虛假分享。想象一下互斥量是連續存儲的。他們可能共享緩存行嗎?我編輯了這個問題,希望更清楚。 – metalfox