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的正确用法的主要内容,如果未能解决你的问题,请参考以下文章

通过 std::unique_ptr 的 LazyArray 模板,这是双重检查习语的正确实现吗?

CAS原子锁 高效自旋无锁的正确用法

在 Windows 中等待 std::atomic<int> 的正确方法?

std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?

std::_Atomic_thread_fence (大写A)这是正确的吗?

如何在 Atom 编辑器中查找引用(或用法)?