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 模板,这是双重检查习语的正确实现吗?
在 Windows 中等待 std::atomic<int> 的正确方法?
std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?