当某个变量int a,被两个线程操作,一个线程只读,另一个线程读写,这时需要lock保护吗?
这个真的跟具体的架构有关系,不同的架构,可能不一样!
但可以肯定,irq中断在指令与指令之间,但多cpu架构时,即使关了中断,别的cpu上的progress也可能改变mem中的东西,所以需要所总线的东西!
参考:http://bbs.chinaunix.net/thread-3653075-1-1.html
2015.4.29
这个真的跟具体的架构有关系,不同的架构,可能不一样!
但可以肯定,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