在多线程环境下
int a=0;
(1)a++;
(2)--a;
(3)b+=2
(4)a=a+2
实验结果:全部都可能。
2.用了如果a声明为atomic<int>呢?
实验结果:可以保证(1)(2)(3)不出问题,可以优化编译成一条机器指令。而(4)不会。
3.如果用了mutex呢,性能上的牺牲是什么样的?
实验结果:显然都不会出问题,但是性能上牺牲很大。测试10个线程跑100000次计算,用时约是仅用atomic语句的300多倍,是不加任何互斥保证的3000多倍。
结论:
1. 如果是a++,a--,--a,++a,b+=2这种类型的操作,一律用atomic保证即可,会优化为一句机器代码,高效且不会出错。
2.如果有b=b+2,之类的,改成b+=2,然后同1;如果是b=c+1这种,怎么优化也是多条机器语句,必须用mutex保证互斥
3.mutex互斥,对性能影响很大,而atomic性能影响很小。所以代码中能用atomic就放心用吧,而mutex小心用。很多情况下,充分利用指针和原子性,未必一定用mutex,很多问题都可以巧妙转化。
下面是一篇c++标准委员会的哥们的博客,作为参考。
ref:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=469