C++ mutex和std::atomic性能比较
- 使用mutex进行访问控制,mutex.c
//方案1:mutex锁保证线程安全
#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
mutex m;
const int N=1e6;
int n;
void increase_n()
{
for(int i=0;i<N;i++)
{
m.lock();
++n;
m.unlock();
}
}
int main()
{
thread t1(increase_n);
thread t2(increase_n);
t1.join();
t2.join();
cout<<n<<endl;
return 0;
}
- 使用std::atomic进行访问控制
//方案2:用原子变量来保证线程安全
#include<thread>
#include<iostream>
#include<atomic>
using namespace std;
const int N=1e6;
atomic<int> n(0);
void increase_n()
{
for(int i=0;i<N;i++)
{
++n;
}
}
int main()
{
thread t1(increase_n);
thread t2(increase_n);
t1.join();
t2.join();
cout<<n<<endl;
return 0;
}
- 进行测试,两个demo都使用GCC O2编译,然后使用time命令进行测试:
结果非常明显,使用std::atomic比mutex效率要高出快一倍,并且没有内核态的参与。
注:上面两个demo来源自网络,并非原创。