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

两个偏特化版本

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

针对整型:atomic<integral>

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

这里的 integral 涵盖了常见的整数类型,包括 charintlong longunsigned 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