c++ 11标准原子操作atomic和mutex锁的区别

 

 

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值