4

这是使用 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++ 中的正确类比吗?

4

2 回答 2

13

std::atomic<T>atomic为模板中定义的操作提供同步。这包括存储 typeT的值、获取 type 的值、将 typeT的值TT原子对象中的 交换,以及一些比较和交换操作。它不能替代对包含对象的正确同步操作。特别是,如果不使用互斥锁保护其数据,LogMessage则从多个线程调用将产生数据竞争。LogMessage

于 2013-12-17T17:33:31.643 回答
1

对“比特袋”的std::atomic工作:一种类型的对象,T其按位表示,存储在sizeof(T)字节中,携带整个值。这意味着需要原子操作(通过对 的这些特定操作std::atomic<T>)的任何内容都不能驻留在由 的成员指向的对象中T,这永远不会起作用。

这也意味着它std::atomic<T>只能用于具体的对象类型T。引用类型是另一个对象的“别名”:引用不是对象

于 2019-12-15T00:33:04.433 回答