这是使用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 ::原子< T>为原子模板中定义的操作提供同步.这包括存储类型T的值,获取类型T的值,使用原子对象中的T交换类型T的值,以及少数比较和交换操作.它不能替代所包含对象上的操作的正确同步.特别是,如果LogMessage不使用互斥锁保护其数据,则从多个线程调用LogMessage将产生数据争用.
相关文章
转载注明原文:c – 正确使用std :: atomic - 代码日志