正确使用std :: atomic

时间:2013-12-17 17:25:09

标签: c++ multithreading atomic

这是使用std :: atomic的正确方法吗?我在命名空间级别声明了一个名为Logger的{​​{1}}:

LOGGER

我的期望是class Logger { public: Logger(); ~Logger(); bool Init(std::wstring logFileLocation); bool Shutdown(); void const LogMessage(std::wstring message); }; std::atomic<Logger&> LOGGER; 将实例化一次(没有比赛;它将从代码中的单个已知点初始化),但随后从多个线程访问。

我是C ++中多线程和线程安全的新手;但是在C#或Java中我想让LOGGER volatile 或(在C#中)放置内存围栏。这是C ++中的正确​​模拟吗?

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

std::atomic在“位包”上工作:类型为T的对象,其按位表示形式存储在sizeof(T)字节中,带有整个值。这意味着{原子std::atomic<T>的成员所指向的对象中,没有任何需要原子操作(通过T的特定操作)的对象将永远无法工作。

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