前言
C++在多线程环境下对共享内存的访问会造成竞态问题,为了解决这个问题,大多数人的解决办法是加锁,这不失是一个好办法
在C++11里面,增加了 std::atomic 中增加了原子操作,允许我们的一些数据类型进行原子读和写,今天就来测试一下这几种方式的性能,以将一个整数在两个线程中各加 500W 为测试用例观看其执行的时间,以毫秒为单位。
一、直接访问
首先声明,多个线程直接访问共享数据会造成结果是不正确的,此处仅分析其性能。
#include <thread>
#include <atomic>
#include <chrono>
#include <iostream>
#include <windows.h>
int job_exclusive = 0; //只有一个线程能修改'job_exclusive',不需要保护
//std::atomic<int> job_exclusive(0);
void job_1()
{
for (int i = 0; i < 5000000; ++i)
++job_exclusive;
}
void job_2()
{
for (int i = 0; i < 5000000; ++i)
++job_exclusive;
}
int main()
{
double start = GetTickCount();
std: