std::atomic 提供了原子操作,用来在多线程环境下安全地访问共享变量。

两个偏特化版本

std::atomic 除了通用模板之外,还提供了两个偏特化版本,分别针对整型和指针类型,在通用接口之外额外暴露了一些更贴近具体类型的操作。

针对整型:atomic<integral>

适用于所有整数类型,在通用模板的基础上补充了整数特有的运算符,例如 operator++ 等,这些操作是通用模板本身不支持的。

这里的 integral 涵盖了常见的整数类型,包括 char、int、long long、unsigned char 等。

针对指针:atomic<Ty *>

适用于任意指针类型,提供了针对指针算术的原子操作方法。

示例代码

下面的例子在两个线程中对同一个 std::atomic<int> 对象并发自增,演示原子操作的基本用法:

 std::atomic<int> x(0);//原子对象x为int,
                
                
                void func_1()
                {
                	for (int i = 0; i < 500000; i++)
                	{
                		x+=1;//原子操作,特化函数
                		//x.fetch_add(1);//公共函数
                	}
                }
                
                int main(int argc, char *argv[])
                {
                
                	auto t = std::thread(func_1);
                
                	t.detach();
                
                	auto t1 = std::thread(func_1);
                
                	t1.detach();
                
                	Sleep(1000);
                
                	cout << x << endl;
                	cout << "main thread" << endl;
                
                
                
                
                	system("pause");
                	return 0;
                }

代码里对 x 的 +=1 是由整型偏特化提供的原子操作,等价于注释里写出的 x.fetch_add(1) 这种通用写法,两者都能保证在多线程并发下不会出现竞争。

参考资料

参考 MSDN:https://msdn.microsoft.com/zh-cn/library/hh874894(v=vs.120).aspx