机器性能和环境
win7 sp1
i5-3470
8GB
vs2017
atomic
atomic(原子操作)是c++11的一个新特性,允许无锁并发编程。
#include <iostream>
#include <thread>
#include <atomic>
#include <vector>
#include <chrono>
using namespace std;
atomic_ullong g_Count(0);
void func();
int main()
{
vector<thread> vt;
auto start = chrono::system_clock::now();
for (size_t i = 0; i < 10; i++)
{
vt.push_back(thread(func));
}
for (auto& iter : vt)
{
iter.join();
}
auto end = chrono::system_clock::now();
cout << "cost " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms" << endl;
cout << "g_Count " << g_Count << endl;
return 0;
}
void func()
{
for (unsigned long long i = 1; i <= 1000000ull; i++)
{
g_Count.fetch_add(i);
}
}
Release 编译 统计5次
平均528.6ms
mutex
mutex互斥量用于保护共享数据免受从多个线程同时访问的同步原语
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <vector>
using namespace std;
mutex mu;
unsigned long long g_Count = 0;
void func();
int main()
{
vector<thread> vt;
auto start = chrono::system_clock::now();
for (size_t i = 0; i < 10; i++)
{
vt.push_back(thread(func));
}
for (auto& iter : vt)
{
iter.join();
}
auto end = chrono::system_clock::now();
cout << "cost " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms" << endl;
cout << "g_Count " << g_Count << endl;
return 0;
}
void func()
{
for (unsigned long long i = 1; i <= 1000000ull; i++)
{
unique_lock<mutex> lk(mu);
g_Count += i;
}
}
Release 编译 统计5次
平均377.6ms
CriticalSection
#include <iostream>
#include <thread>
#include <chrono>
#include <vector>
#include <Windows.h>
using namespace std;
unsigned long long g_Count = 0;
CRITICAL_SECTION cs;
void func();
int main()
{
vector<thread> vt;
InitializeCriticalSection(&cs);
auto start = chrono::system_clock::now();
for (size_t i = 0; i < 10; i++)
{
vt.push_back(thread(func));
}
for (auto& iter : vt)
{
iter.join();
}
auto end = chrono::system_clock::now();
cout << "cost " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms" << endl;
cout << "g_Count " << g_Count << endl;
DeleteCriticalSection(&cs);
return 0;
}
void func()
{
for (unsigned long long i = 1; i <= 1000000ull; i++)
{
EnterCriticalSection(&cs);
g_Count += i;
LeaveCriticalSection(&cs);
}
}
Release 编译 统计5次
平均323.4ms
总结
在win7平台 vs2017 下,临界区优于mutex,mutex优于atomic。