读写互斥

当某个变量int a,被两个线程操作,一个线程只读,另一个线程读写,这时需要lock保护吗?
这个真的跟具体的架构有关系,不同的架构,可能不一样!
但可以肯定,irq中断在指令与指令之间,但多cpu架构时,即使关了中断,别的cpu上的progress也可能改变mem中的东西,所以需要所总线的东西!

参考:http://bbs.chinaunix.net/thread-3653075-1-1.html

只是赋值操作的话,因为本身armv6,armv7对word aligned的地址的word写操作就是atomic的,所以不需要任何锁机制。

但用C写的 a = 5; a==5; a<5 这些操作编译后,是一条指令吗?是确定的吗?
根据http://blog.jobbole.com/54345/

在C和C++中,所有操作被认定是非原子的,甚至是普通的32位整数赋值,除非被别的编译器或者硬件供应商指定。

1
2
3
4
5
6
uint32_t foo = 0 ;
 
void storeFoo()
{
       foo = 0x80286 ;
}

这个语言标准并没有提到任何有关于这种情况下的原子性。也许整型赋值是原子的,也许不是。因为非原子操作没有做任何保证,在C定义中,普通整型赋值是非原子的。

实际上,我们对我们的目标平台了解的更多。例如,大家都知道在现在的x86、x64、Itanium、SPARC、ARM和PowerPC处理机上,只要目标变量是自然对齐的,那么普通32位整型赋值就是原子的,你可以通过查询你的处理机手册或者编译器文档来证实。在游戏行业,我可以告诉你很多关于32位整型赋值依赖这个特殊保证的例子。


2015.4.29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值