如何在单例中制作原子getter和setter?

时间:2016-08-23 23:00:56

标签: c++ visual-c++ visual-studio-2015 stdatomic

我有一个getter和setter结构,我用它来使用std :: unique_lock lock来访问。所有的getter共享同一个锁,它基本上对单例的任何请求进行了序列化。上述解决方案有效,但速度很慢。我还担心死锁,特别是因为大多数对数据结构的访问都是读取。我说70%的访问都是读取。我开始研究原子操作b \ c有一些关于无锁同步的嗡嗡声。

我注意到我的代码库出现了大幅减速。首先让我抢先任何有关架构的建议。此代码仅在x86上运行,因此它不是内存栅栏问题。第二,我正在使用获取语义来加载和释放存储的语义,这就是x86明确保证不存在内存限制的内容。

我的理论是我没有使用正确的memory_order来完成我想做的事情,或者至少我的库在实践中是如何使用的,或者它与我的编译器有关。

所以我正在为我的编译器使用MSVC 2015更新2,而减速在调试版本中最为普遍。

struct Singleton_struct
    {
        std::atomic_bool m_bIs1;
        std::atomic_bool m_bIs2;
        std::atomic_bool m_bIs3;
        Singleton_struct() : m_bIs1(false), m_bIs2(false), m_bIs3(false) {};

        void set1(bool bIs1);
        void set2(bool bIs2);
        void set3(bool bIS3);

        bool is1();
        bool is2();
        bool is3();
    }

Singleton_struct::set1(bool bIs1)
{
    m_bIs1.store(bIs1, std::memory_order_release); 
}

Singleton_struct::set2(bool bIs2)
{
    m_bIs2.store(bIs2, std::memory_order_release); 
}

Singleton_struct::set3(bool bIs3)
{
    m_bIs3.store(bIs3, std::memory_order_release); 
}

bool Singleton_struct::is1()
{
    return m_bIs1.load(std::memory_order_acquire); 
}

bool Singleton_struct::is2()
{
    return m_bIs2.load(std::memory_order_acquire); 
}

bool Singleton_struct::is3()
{
    return m_bIs3.load(std::memory_order_acquire); 
}

0 个答案:

没有答案