多线程环境下,基本增减赋值操作的原子性实验[atomic,mutex]

在多线程环境下

int a=0;


 (1)a++;

 (2)--a;

(3)b+=2

(4)a=a+2


1.如果上面四个语句不加互斥访问,会出现问题的是?


实验结果:全部都可能。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值