std :: atomic的正确用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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::atomic<T>atomic模板中定义的操作提供同步。这包括存储类型为T的值,获取类型为T的值,将类型为T的值与原子对象中的T交换以及一些比较和交换操作。它<< not >>替代了对包含对象的正确操作同步。特别是,如果LogMessage不使用互斥锁保护其数据,则从多个线程调用LogMessage将产生数据争用。

另一答案
std::atomic处理“位包”:类型为T的对象,其按位表示形式存储在sizeof(T)字节中,带有整个值。这意味着,不需要原子操作(通过std::atomic<T>的这些特定操作)的任何内容都不能驻留在T成员指向的对象中,该对象将永远无法工作。

以上是关于std :: atomic的正确用法的主要内容,如果未能解决你的问题,请参考以下文章