多线程锁的一点测试
来源:互联网 发布:怎么看网站是不是cms 编辑:程序博客网 时间:2024/05/22 10:26
C++11提供了原子操作atomic;而在一些代码中,也会经常看到利用原子操作来实现spinklock(pthread提供的spinklock似乎性能不如mutex)。
于是,我就来试试用atomic来实现spinklock。
测试,仅仅是测试lock/unlock。测试平台是windows和linux.
测试结果,两种锁耗时完全一样;(另外,windows耗时大约是linux耗时的2倍)
于是,我就来试试用atomic来实现spinklock。
测试,仅仅是测试lock/unlock。测试平台是windows和linux.
测试结果,两种锁耗时完全一样;(另外,windows耗时大约是linux耗时的2倍)
测试结论:感觉,没有必要用spinklock,因为性能几乎没有差别;而spinklock用着还需要非常小心,因为它是忙等待(死循环等待).
#include <ctime>#include <mutex>#include <atomic>class SpinLock{public: SpinLock(){} ~SpinLock(){} void Lock() { //如果已经有人set了,那么返回true;如果没有set,那么set并且返回false; while (flag_.test_and_set()) { //do nothing; } } void UnLock() { flag_.clear(); }private: std::atomic_flag flag_;};struct SpinkLockGuard{public: SpinkLockGuard(SpinLock &l) :spinlock_(l) { spinlock_.Lock(); } ~SpinkLockGuard() { spinlock_.UnLock(); }private: SpinLock &spinlock_;};int32_t times = 10*1024 * 1024;//#define COST(t1,t0) ((t1.tv_sec-t0.tv_sec)*1000*1000 + (t1.tv_usec-t0.tv_usec))#define COST(tv1,tv0) (int64_t)(((tv1-tv0)*1000*1000)/CLOCKS_PER_SEC)void time_show(int64_t cost){ int64_t old = cost; int32_t avg = (int32_t)(cost / times); int32_t r_usec = cost % (1000); cost = (int64_t)(cost / (1000)); int32_t r_msec = cost % 1000; cost = (int64_t)(cost / (1000)); printf("[test]lock/unlock %d times\n", times); printf("[test]\t cost all time (%ld:%d:%d)[s:ms:us](%ld'us) \n", cost, r_msec, r_usec, old); printf("[test]\t cost avt = (%d:%d)[ms:us](one msg)\n", (int32_t)(avg / 1000), (int32_t)(avg % 1000));}void test_lock(){ clock_t tv0, tv1; tv0 = clock(); SpinLock lock_; for (int32_t i = 0; i != times; ++i) { SpinkLockGuard guard(lock_); } tv1 = clock(); printf("spinklock cost time:\n"); time_show(COST(tv1, tv0)); clock_t tv2, tv3; tv2 = clock(); std::mutex mutex_; for (int32_t i = 0; i != times; ++i) { std::lock_guard<std::mutex> guard(mutex_); } tv3 = clock(); printf("\n---------------------------\nmutex lock cost time:\n"); time_show(COST(tv1, tv0));}int main(){ test_lock(); return 0;}
0 0
- 多线程锁的一点测试
- 多线程写图像文件的一点小测试
- 多线程写图像文件的一点小测试(Boost + Gual)
- 多线程的一点讲解
- 多线程的一点思考
- 多线程的一点小事
- 测试的一点经验总结
- 测试的一点心得
- 多线程编程的一点讨论
- 关于多线程的一点总结
- 多线程调试的一点思路
- 关于多线程的一点笔记
- 关于多线程的一点感想
- JAVA多线程的一点知识
- 测试方案设计的一点心得。
- junit测试的一点心得
- 自动化测试的一点看法
- 测试管理的一点心得
- swift开发笔记5 - 设置屏幕方向和代码控制布局
- 传感器的应用/SurfaceView/制作简单的指南针
- rgba()和opacity的透明效果有什么不同?
- 在vs2005中使用静态链接库和动态链接库
- android inflater 用法
- 多线程锁的一点测试
- 各类文件头特征码
- jqury-easyui datagrid
- YARN内存使用优化配置
- PullToRefreshScrollView嵌套ListView时,下拉刷新ListView自动滑动到底部
- LeetCode 94: Binary Tree Inorder Traversal
- noip2008 笨小猴 (模拟)
- 安装Oracle 11g R2静默安装安装
- HDFS文件写入