c – 正确使用std :: atomic

这是使用std :: atomic的正确方法吗?我在命名空间级别声明了一个名为LOGGER的Logger:

class Logger {
    public:

    Logger();
    ~Logger();

    bool Init(std::wstring logFileLocation);
    bool Shutdown();

    void const LogMessage(std::wstring message);
};

std::atomic<Logger&> LOGGER;

我的期望是LOGGER将实例化一次(没有比赛;它将从代码中的单个已知点初始化),但随后从多个线程访问.

我是C语言中多线程和线程安全的新手;但是在C#或Java中我想要使LOGGER变为volatile或(在C#中)将内存围栏放在它周围.这是C中的正确类比吗?

最佳答案
的std ::原子< T>为原子模板中定义的操作提供同步.这包括存储类型T的值,获取类型T的值,使用原子对象中的T交换类型T的值,以及少数比较和交换操作.它不能替代所包含对象上的操作的正确同步.特别是,如果LogMessage不使用互斥锁保护其数据,则从多个线程调用LogMessage将产生数据争用.

转载注明原文:c – 正确使用std :: atomic - 代码日志