+ -
当前位置:首页 → 问答吧 → 对于一个整型变量,多线程访问,到底需不需要互斥锁?

对于一个整型变量,多线程访问,到底需不需要互斥锁?

时间:2010-09-06

来源:互联网

多个线程都要读取这个int变量,根据不同值进行不同的操作,读取的时候需要互斥吗?

作者: rain_fish   发布时间: 2010-09-06

应该要。

作者: ecjtubaowp   发布时间: 2010-09-06

整型变量如果对齐了的话,一个总线周期就能访问,所以应该是原子的吧。。。说不好,等高手讲解。。。

作者: liwangli1983   发布时间: 2010-09-06

arch/x86/include/asm/atomic_32.h

作者: net_robber   发布时间: 2010-09-06

回复 net_robber


    啥意思?

作者: rain_fish   发布时间: 2010-09-06

如果不互斥会带来什么问题?还请各位达人讨论一下。。

作者: rain_fish   发布时间: 2010-09-06

作者: hellioncu   发布时间: 2010-09-06

读取不需要吧,写要加锁

作者: sepnic   发布时间: 2010-09-06

本帖最后由 zhangsuozhu 于 2010-09-06 10:24 编辑

字节对齐上的整型变量在读取和写入时都是原子操作。

字节对齐即,可以被4整除的地址。

最新的P4 CPU.非内存对齐也是原子操作。


http://bbs.chinaunix.net/thread-1777237-1-4.html

作者: zhangsuozhu   发布时间: 2010-09-06

只读加什么锁

作者: tajial   发布时间: 2010-09-06

  1. 从Intel486 processor开始,以下的基本内存操作是原子的:
  2. • Reading or writing a byte(一个字节的读写)
  3. • Reading or writing a word aligned on a 16-bit boundary(对齐到16位边界的字的读写)
  4. • Reading or writing a doubleword aligned on a 32-bit boundary(对齐到32位边界的双字的读写)

  5. 从Pentium processor开始,除了之前支持的原子操作外又新增了以下原子操作:
  6. • Reading or writing a quadword aligned on a 64-bit boundary(对齐到64位边界的四字的读写)
  7. • 16-bit accesses to uncached memory locations that fit within a 32-bit data bus(未缓存且在32位数据总线范围之内的内存地址的访问)

  8. 从P6 family processors开始,除了之前支持的原子操作又新增了以下原子操作:
  9. • Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line(对单个cache line中缓存地址的未对齐的16/32/64位访问)

  10. 那么哪些操作是非原子的呢?
  11. Accesses to cacheable memory that are split across bus widths, cache lines, and
  12. page boundaries are not guaranteed to be atomic by the Intel Core 2 Duo, Intel®
  13. Atom™, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, P6 family, Pentium, and
  14. Intel486 processors.(说点简单点,那些被总线带宽、cache line以及page大小给分隔开了的内存地址的访问不是原子的,你如果想保证这些操作是原子的,你就得求助于机制(2),对总线发出相应的控制信号才行)。

  15. 一个需要注意的是尽管从P6 family开始对非对齐的一些读写操作已经提供了原子性保障,但是非对齐访问时非常影响性能的,一般需要尽量避免。当然了,对于一般的程序员来说不需要太担心这个,因为大部分编译器会自动帮你完成内存对齐。
复制代码

作者: zhangsuozhu   发布时间: 2010-09-06

相关阅读 更多