多线程程序何时需要加锁
2016-06-12 14:01
211 查看
简单的说三条:
多人读,不需要
一读一写要加
多人写要加
常见错误
1读1写没事,读写的内存约多,越容易出事,因为不是原子操作
对int/int64/char型是原子操作, 可不加锁, 其实没人保证这一点的, 要不c++1x还出个原子模板类干什么
常用实例
vector的[]操作是安全的, 如一个线程里 buf[0]++, 另一个buf[1]--是安全的, 因为[]的实现是 start+n, 多线程操作符合多人只读条件
最后锁分为互斥(mutex)和自旋(spin)锁
前者,在第一个人锁住后, 第二个人进不去时会sleep, cpu可以去干别的
spin锁的话,第二个人会一直在门口等, cpu也一直占着,缺点显而易见, 有点是进去快, 效率高
多人读,不需要
一读一写要加
多人写要加
常见错误
1读1写没事,读写的内存约多,越容易出事,因为不是原子操作
对int/int64/char型是原子操作, 可不加锁, 其实没人保证这一点的, 要不c++1x还出个原子模板类干什么
常用实例
vector的[]操作是安全的, 如一个线程里 buf[0]++, 另一个buf[1]--是安全的, 因为[]的实现是 start+n, 多线程操作符合多人只读条件
最后锁分为互斥(mutex)和自旋(spin)锁
前者,在第一个人锁住后, 第二个人进不去时会sleep, cpu可以去干别的
spin锁的话,第二个人会一直在门口等, cpu也一直占着,缺点显而易见, 有点是进去快, 效率高
相关文章推荐
- 关于Environment.getExternalStorageDirectory()不能获取SD卡路径问题
- String、StringBuffer、StringBuilder的区别
- (二)企业部分之lnmp环境的搭建:mysql源码安装
- 创建镜像
- impala不能查询hive中新增加的表问题
- MySQL 基本操作之数据库操作
- 网站页面的颜色和线条搭配
- UITextField限制个数,没用代理
- 淘宝开源消息中间件-Metamorphosis
- Docker安装
- View的测量过程学习onMeasure
- CSS基础
- 千万级规模高性能、高并发的网络架构经验
- texturepacker
- git 基本操作
- 正则表达式
- js中如果long类型值过长,字段自动截取问题
- Docker Swarm项目
- 运算符来测试平等
- 四大组件之Service(一)-双子座的Service-Start Service与Bind Service