std::mutex 标准库的互斥锁;CRITICAL_SECTION Windows提供的临界区;QMutex Qt提供的互斥锁封装,显然,Qt封装的效率一般不如前两者。
参照这篇文章:https://www.iteye.com/blog/aigo-1908084
和他的结论差不多:在旧版本编译器上(如VS2012/2013),std::mutex 比临界区更慢;在新版本编译器上(如VS2015/2017),std::mutex 的效率显著提高,特别在竞争情况下比临界区快多了。
下面是 VS2013 和 VS2017 的运行截图(x86 Release):
测试代码两份:
#include
#include
#include
#include
#include
#include
#include
#include
//表示被锁定的资源,每次加1
long total = 0;
//win临界区
//Windows下的Mutex和CRITICAL_SECTION,都是递归锁,
//而Linux下的pthread_mutex,默认是非递归锁
CRITICAL_SECTION critical;
//互斥锁
std::mutex mtx;
//可递归互斥锁
std::recursive_mutex r_mtx;
void run_critical(int count)
{
for (int i = 0; i < count; ++i)
{
EnterCriticalSection(&critical);
++total;
LeaveCriticalSection(&critical);
}
}
void run_mutex(int count)
{
for (int i = 0; i < count; ++i)
{
//std::lock_guard guard(mtx);
mtx.lock();
++total;
mtx.unlock();
}
}
void run_recursive_mutex(int count)
{
for (int i = 0; i < count; ++i)
{
//std::lock_guard guard(r_mtx);
r_mtx.lock();
++total;
r_mtx.unlock();
}
}
void run_test(std::function func, int thread_count, const char * type)
{
std::list threadlist;
total = 0;
clock_t start = clock();
for (int i = 0; i < thread_count; ++i)
{
std::thread *t1 = new std::thread(func);
threadlist.push_back(t1);
}
for (std::list::const_iterator i = threadlist.begin(); i != threadlist.end(); i++)
{
(*i)->join();
}
clock_t finish = clock();
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?