c++ - std::atomic 的正确用法

标签 c++ multithreading thread-safety stdatomic

这是使用 std::atomic 的正确方法吗?我有一个在名为 LOGGER 的 namespace 级别声明的 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在原子对象中,以及一些比较和交换操作。它不是替代对所包含对象的正确同步操作。特别是,调用 LogMessage如果 LogMessage,来自多个线程将产生数据竞争不使用互斥体保护其数据。

关于c++ - std::atomic 的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640749/

相关文章:

C++使用ofstream写入文件

c++ - 在 Visual Studio 2017 Community Edition 上编译 Qt 5.8 报错

c++ - 使鼠标位置不受屏幕大小、C++ 和 Windows 的限制

c++ - 体素世界中的碰撞检测

java - java程序中线程的字数统计

c++ - 信号量、互斥体和条件变量的选择

ruby-on-rails - 如何使用 ruby​​ 加速大型 CSV 的处理

android - 如何在 Android 工作线程上对任务进行排队?

C++ 从两个线程访问 Int 变量。线程安全?

c++ - 线程是否共享一些类字段?