这是使用 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/