i++的线程安全性
来源:互联网 发布:mysql怎么删除所有表 编辑:程序博客网 时间:2024/04/30 00:10
i++的线程安全性可以总结如下:
(1)如果i是局部变量,那么是可重入的,也就是线程安全的。
(2)如果i是全局变量,则同一进程的不同线程都可能访问到该变量,因而是线程不安全的。
上面这两点比较清晰,具体原因我将在下面解释:
本质上来讲,i并不是因为是全局变量才说是线程不安全的。其实其本质原因是i++这个操作并不是原子的,如果这是原子操作的话,具有不可分特性,那么即便是所有线程都能访问到,也都是线程安全的。
i++最终被编译后的反汇编代码大概如下:
mov eax,【xxxxxxxx】
inc eax
一条c语句已经被分为两条操作指令,那么在这两条操作指令执行之间,可能由于中断而被调度到不同线程,于是,不安全性就产生了。当然了,这并不是说单条汇编语句就是线程安全的,这取决于CPU架构,因为单条汇编指令可能在多个CPU时钟周期内进行,有些CPU架构可以在任何一个时钟周期内响应中断,对于这样的CPU,就是单条指令都不是安全的。当然了,现在的CPU大部分都是一条指令执行完后才能响应中断的。想要进行原子操作,方法有很多种,其中一种比较简单的是在原子语句之间先关闭中断,然后进行原子操作后再打开中断就OK了。
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- i++和++i的线程安全性问题
- 线程安全性---面试题--i++的线程安全性问题
- 类的线程安全性
- STL的线程安全性
- shared_ptr的线程安全性
- SimpleDateFormat的线程安全性
- 线程的安全性
- 线程的安全性
- 全局变量的线程安全性
- java的基本类型和i++线程安全性的深入解析
- java的基本类型和i++线程安全性的深入解析
- IConfigurationSectionHandler的线程安全性问题
- 线程安全性的文档化
- 创业公司CEO最重要的事有哪些?
- 如果你用过这些电子产品 证明你老了
- “天链一号01 星”中继性能仿真分析
- 用VC进行屏幕截取编程
- VC++ 下截取屏幕相关操作:
- i++的线程安全性
- 39级台阶(竞赛题,Go语言实现)
- C#遍历DataSet中数据的几种方法总结
- Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期
- php mysqli->query() 插入中文失败的解决
- http://man.chinaunix.net/ 手册中心
- Asp.net 备份、还原Ms SQLServer及压缩Access数据库
- 使用Xcode和Instruments调试解决iOS内存泄露
- Asp.net 文件上传基类(取得文件后缀名,保存文件,加入文字水印)