多线程编程问题
来源:互联网 发布:淘宝客怎么收费? 编辑:程序博客网 时间:2024/04/28 12:29
1. int变量操作的原子性
x86汇编中,对任何内存地址中的1byte的读永远是原子的。可以总结为:在对齐的情况下,小于处理器位数的数据读取是原子的。但在C++中,使用强制转换后的内容不再保证对齐,于是就没有了原子性。基于这些原因,在程序中应该直接atomic相关的函数来保证原子性。
2. volatile在多线程中应该怎么用
上一条中说明了不能用一个变量来保证原子性,即使加上volatile也没用。在多线程中,volatile应该用于在加锁的前提下,防止指令不会因编译器的优化而省略,且要求每次直接读值。
3. 什么是指令乱序
处理器乱序 是指在执行指令时,如果后一第指令不依赖前一条的执行结果,则后一条指令有可能会在前一条指令返回前执行。处理器乱序不会对上层的运行结果产生影响。
编译器乱序 是为了优化处理器乱序,受到处理器预取单元的能力限制,处理器每次只能分析一小块指令,编译器能够对很大一个范围的代码进行分析,并将其尽量靠近排列让处理器更容易预取和并发执行。
通常简单地使用volatile关键字就可以解决编译器的乱序问题(并不能保证编译器不做其他任何优化),但是这些指令到了处理器执行的时候,仍然可能被乱序。对于处理器乱序执行的避免就需要用到一组 内存屏障 函数(barrier)了。
对于切实是需要保障访存顺序的代码,就算当前使用的编译器能够编译出有序的目标码来,我们也还是必须通过设置内存屏障的方式来保证有序,否则都是不严谨,有隐患的。
4. 自旋锁
自旋锁与互斥锁类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查询锁的保持者是否已经释放了锁。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率高于互斥锁,但也应该考虑其一直占用CPU带的影响,适用于锁持有时间短,不希望在调度上花太多成本。在《APUE》11.6.7有详细介绍。
- Linux 多线程编程问题
- Lniux 多线程编程问题
- MFC 多线程编程问题
- Java多线程编程问题
- 多线程编程问题
- 多线程编程问题
- Libcurl多线程编程问题
- 多线程编程中的本质问题
- (急求急求!!!!!!!!!!!!!!!)多线程编程:哲学家问题
- 多线程编程之一 问题提出
- java多线程编程注意问题
- 多线程编程之一——问题提出
- linux下 多线程编程 哲学家就餐问题
- 多线程编程之一——问题提出
- 多线程编程之一——问题提出
- 多线程编程之一——问题提出
- 多线程编程之一——问题提出
- 多线程编程之一——问题提出
- Proactor和Reactor的简单分析
- 为什么使用Threalocal及其原理
- openCV4Android环境搭建
- nyoj37 回文字符串
- 脸上8部位长痘原因与器官关系
- 多线程编程问题
- nyoj 119 士兵杀敌(三)
- C++ Primer 学习笔记_47_类与数据抽象 --类的定义和声明
- 正多变形的滚动与旋轮线下方的面积(有趣的几何问题)
- 指针函数与函数指针的区别
- ORACLE数据库-学习笔记1
- C++ Primer 学习笔记_48_类与数据抽象 -类的定义跟声明【下】
- C++第五次实验-数组分离
- Java面试题 单例类