pthread与tbb中各种锁的对比测试
来源:互联网 发布:淘宝买武士刀犯法吗 编辑:程序博客网 时间:2024/05/02 00:39
pthread中提供的锁有:pthread_mutex_t, pthread_spinlock_t, pthread_rwlock_t。
pthread_mutex_t是互斥锁,同一瞬间只能有一个线程能够获取锁,其他线程在等待获取锁的时候会进入休眠状态。因此pthread_mutex_t消耗的CPU资源很小,但是性能不高,因为会引起线程切换。
pthread_spinlock_t是自旋锁,同一瞬间也只能有一个线程能够获取锁,不同的是,其他线程在等待获取锁的过程中并不进入睡眠状态,而是在CPU上进入“自旋”等待。自旋锁的性能很高,但是只适合对很小的代码段加锁(或短期持有的锁),自旋锁对CPU的占用相对较高。
pthread_rwlock_t是读写锁,同时可以有多个线程获得读锁,同时只允许有一个线程获得写锁。其他线程在等待锁的时候同样会进入睡眠。读写锁在互斥锁的基础上,允许多个线程“读”,在某些场景下能提高性能。
诸如pthread中的pthread_cond_t, pthread_barrier_t, semaphone等,更像是一种同步原语,不属于单纯的锁。
TBB中提供的锁有:
mutex 互斥锁,等同于pthread中的互斥锁(实际上就是对pthread_mutex_t进行封装)
recurisive_mutex 可重入的互斥锁,在pthread_mutex_t的基础上加了一个可重入的属性
spin_metux 自旋锁,与pthread_spinlock_t类似,但是性能比pthread_spinlock_t低28%
queuing_metux 公平的互斥锁,严格按照等待锁的先后顺序获得锁
spin_rw_mutex 读写自旋锁,功能与pthread_rwlock_t一致,但是性能比pthread_rwlock_t高很多
queuing_rw_mutex 公平的读写读写锁,也是严格按照等待锁的先后顺序获得锁
以下是我对一个拥有3667527个节点的HASH表进行读操作所花费的时间,可以说明各种锁的性能:
(多线程的环境为:4CPU的电脑上使用四个线程进行同样的度操作,然后取四个线程读取的平均时间)
·单线程不加锁:0.818845s
·多线程使用pthread_mutex_t:120.978713s (很离谱吧…………我也吓了一跳)
·多线程使用pthread_rwlock_t:10.592172s (多个线程加读锁)
·多线程使用pthread_spinlock_t:4.766012s
·多个线程使用tbb::spin_mutex:6.638609s (从这里可以看出pthread的自旋锁比TBB的自旋锁性能高出28%)
·多个线程使用tbb::spin_rw_mutex:3.471757s (并行读的环境下,这是所有锁中性能最高的)
pthread_mutex_t是互斥锁,同一瞬间只能有一个线程能够获取锁,其他线程在等待获取锁的时候会进入休眠状态。因此pthread_mutex_t消耗的CPU资源很小,但是性能不高,因为会引起线程切换。
pthread_spinlock_t是自旋锁,同一瞬间也只能有一个线程能够获取锁,不同的是,其他线程在等待获取锁的过程中并不进入睡眠状态,而是在CPU上进入“自旋”等待。自旋锁的性能很高,但是只适合对很小的代码段加锁(或短期持有的锁),自旋锁对CPU的占用相对较高。
pthread_rwlock_t是读写锁,同时可以有多个线程获得读锁,同时只允许有一个线程获得写锁。其他线程在等待锁的时候同样会进入睡眠。读写锁在互斥锁的基础上,允许多个线程“读”,在某些场景下能提高性能。
诸如pthread中的pthread_cond_t, pthread_barrier_t, semaphone等,更像是一种同步原语,不属于单纯的锁。
TBB中提供的锁有:
mutex 互斥锁,等同于pthread中的互斥锁(实际上就是对pthread_mutex_t进行封装)
recurisive_mutex 可重入的互斥锁,在pthread_mutex_t的基础上加了一个可重入的属性
spin_metux 自旋锁,与pthread_spinlock_t类似,但是性能比pthread_spinlock_t低28%
queuing_metux 公平的互斥锁,严格按照等待锁的先后顺序获得锁
spin_rw_mutex 读写自旋锁,功能与pthread_rwlock_t一致,但是性能比pthread_rwlock_t高很多
queuing_rw_mutex 公平的读写读写锁,也是严格按照等待锁的先后顺序获得锁
以下是我对一个拥有3667527个节点的HASH表进行读操作所花费的时间,可以说明各种锁的性能:
(多线程的环境为:4CPU的电脑上使用四个线程进行同样的度操作,然后取四个线程读取的平均时间)
·单线程不加锁:0.818845s
·多线程使用pthread_mutex_t:120.978713s (很离谱吧…………我也吓了一跳)
·多线程使用pthread_rwlock_t:10.592172s (多个线程加读锁)
·多线程使用pthread_spinlock_t:4.766012s
·多个线程使用tbb::spin_mutex:6.638609s (从这里可以看出pthread的自旋锁比TBB的自旋锁性能高出28%)
·多个线程使用tbb::spin_rw_mutex:3.471757s (并行读的环境下,这是所有锁中性能最高的)
- pthread与tbb中各种锁的对比测试
- pthread的各种同步机制
- pthread的各种同步机制
- Pthread的各种同步机制
- pthread的各种同步机制
- Oracle与MySQL中“可串行化”的对比测试
- MySQL连接与创建pthread开销对比
- pthread与std::thread对比用法
- 各种视频格式的对比与解析
- 跨平台的并行库 OpenMP, pthread(POsix),BOOST,thread,Intel TBB 等并行库
- Centos系统中 Android tbb的编译
- 各种流量采集方式的性能对比测试结果
- 各种流量采集方式的性能对比测试结果
- ElasticSearch 与 Solr 的对比测试
- 各种图片格式的对比
- 各种编码的对比
- 并行与TBB
- tbb安装与配置
- 递归算法简单总结
- QT记事本
- Adobe Flash Stage3D ---- Molehill 相关
- POJ1003
- C# ClickOnce部署报错 “清单中的引用与下载的程序集标识不匹配”解决方法
- pthread与tbb中各种锁的对比测试
- hibernate 乐观锁与悲观锁使用
- 傲娇Android二三事之天不长地不久的Bitmap.compress
- linux常用命令
- Java在ACM中的使用
- 金正恩为什么总是喜欢打鸡血
- java 泛型详解
- apache+tomcat访问速度变慢问题
- 10个iPhone开发网站、论坛、博客