c++在线编码网站http://cpp.sh/
不加锁情况
#include <thread>
#include <atomic>
#include <iostream>
#include <time.h>
using namespace std;
// 全局的结果数据
long total = 0;
static const int numthread = 50;
// 点击函数
void click()
{
for(int i=0; i<1000000;++i)
{
// 对全局数据进行无锁访问
total += 1;
}
}
int main()
{
// 计时开始
clock_t start = clock();
// 创建100个线程模拟点击统计
std::thread mythread[numthread];
for (int i = 0; i < numthread;i++)
{
mythread[i] = std::thread(click);
}
for (int i = 0; i < numthread; i++)
{
mythread[i].join();
}
// 计时结束
clock_t finish = clock();
// 输出结果
cout<<"result:"<<total<<endl;
cout<<"duration:"<<finish -start<<"ms"<<endl;
return 0;
}
这段代码多运行几次(15次左右),会出现错误
result:50000000
duration:1443ms
result:50000000
duration:1774ms
result:50000000
duration:2190ms
result:49000000
duration:1494ms
这是因为多个线程对共享数据进行操作时出现了数据数据脏读现象。
c++11前,可用mutex锁对数据进行保护
#include <thread>
#include <atomic>
#include <iostream>
#include <time.h>
#include <mutex>
using namespace std;
// 全局的结果数据
long total = 0;
static const int numthread = 50;
// 点击函数
mutex m;
void click()
{
m.lock();
for(int i=0; i<1000000;++i)
{
// 访问之前,锁定互斥对象
total += 1;
// 访问完成后,释放互斥对象
}
m.unlock();
}
int main()
{
// 计时开始
clock_t start = clock();
// 创建100个线程模拟点击统计
std::thread mythread[numthread];
for (int i = 0; i < numthread;i++)
{
mythread[i] = std::thread(click);
}
for (int i = 0; i < numthread; i++)
{
mythread[i].join();
}
// 计时结束
clock_t finish = clock();
// 输出结果
cout<<"result:"<<total<<endl;
cout<<"duration:"<<finish -start<<"ms"<<endl;
return 0;
}
不会出现错误
result:50000000
duration:2147ms
result:50000000
duration:1746ms
result:50000000
duration:1305ms
result:50000000
duration:2508ms
c++11,可用atomic库对数据实现原子操作
#include <thread>
#include <atomic>
#include <iostream>
#include <time.h>
#include <mutex>
using namespace std;
// 全局的结果数据
atomic_long total(0);
static const int numthread = 50;
// 点击函数
void click()
{
for(int i=0; i<1000000;++i)
{
total += 1;
}
}
int main()
{
// 计时开始
clock_t start = clock();
// 创建100个线程模拟点击统计
std::thread mythread[numthread];
for (int i = 0; i < numthread;i++)
{
mythread[i] = std::thread(click);
}
for (int i = 0; i < numthread; i++)
{
mythread[i].join();
}
// 计时结束
clock_t finish = clock();
// 输出结果
cout<<"result:"<<total<<endl;
cout<<"duration:"<<finish -start<<"ms"<<endl;
return 0;
}
结果花费时间较久,可能是由于在线编码系统的原因
result:50000000
duration:4788023ms
result:50000000
duration:4869474ms
result:50000000
duration:4944417ms