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