C++11多线程之mutex等锁机制和atomic原子操作对比

一.简介

这里以mutex锁机制为例.
mutex函数:是一套专门用于线程同步锁机制的函数.
    #include <mutex>
    using namespace std;

atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等.
    #include <atomic>
    using namespace std;

二.效率对比

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <time.h>

#define TEST_DATA_LENGTH 100000 //每个线程操作次数
#define THREAD_NUM 10 //线程个数

using namespace std;//引入std命名空间

mutex m;//声明互斥锁m

long n_total = 0;
long m_total = 0;
atomic<long> a_total = 0;//原子量的初始化

//在不采用互斥锁和原子类的情况下
void test_f_normal()
{
    for(int i = 0; i < TEST_DATA_LENGTH; i++)
    {
        n_total += 1;
    }
}

//使用mutex互斥锁
void test_f_mutex()
{
    for(int i = 0; i < TEST_DATA_LENGTH; i++)
    {
        m.lock();
        m_total += 1;
        m.unlock();
    }
}
//使用原子操作
void test_f_atomic()
{
    for(int i = 0; i < TEST_DATA_LENGTH; i++)
    {
        a_total += 1;
    }
}




void main()
{
    thread ts[THREAD_NUM];
    //normal mode ,result is error
    clock_t start = clock();

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i] = thread(&test_f_normal);
    }

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i].join();
    }

    clock_t end = clock();
    cout << "total: " << n_total << endl;
    cout << "test_f_normal: " << end - start << endl;


    //use mutex ,
    clock_t mstart = clock();

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i] = thread(&test_f_mutex);
    }

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i].join();
    }

    clock_t mend = clock();
    cout << "total: " << m_total << endl;
    cout << "test_f_mutex: " << mend - mstart << endl;

    //use atomic
    clock_t astart = clock();

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i] = thread(&test_f_atomic);
    }

    for(int i = 0; i < THREAD_NUM; i++)
    {
        ts[i].join();
    }

    clock_t aend = clock();
    cout << "total: " << a_total << endl;
    cout << "test_f_atomic: " << aend - astart << endl;

    system("pause");
    return;
}

温馨提示:在运行”test_f_normal: XX”时候可能会卡住
原因是:在使用互斥锁的情况下,效率会慢很多,可以通过设置线程个数/操作次数即可修改.耐心等待.

运行结果:

total: 601409
test_f_normal: 29
total: 1000000
test_f_mutex: 11274
total: 1000000
test_f_atomic: 35

三.总结

由上面的测试结果可以看得出来
1.在不使用互斥锁和原子量的时候,多线程的操作会使结果是错误的.
2.原子操作的实现跟普通数据类型类似,但是它能够在保证结果正确的前提下,提供比mutex等锁机制更好的性能

提示:开发过程中,对于多线程的情况下,单个基础数据类型的数据共享安全,尽量使用原子操作代替锁机制. 当需要对代码块进行数据安全保护的时候,就需要选择使用锁机制了.

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
多线程操作Vector可以提高程序的运行效率和并发性。Vector是一个线程安全的容器,可以被多个线程同时访问和修改。但是在多线程操作Vector时,需要注意以下几点。 首先,多线程操作Vector需要进行同步控制,以避免数据竞争和并发访问的问题。可以通过使用互斥锁(mutex)来实现线程间的互斥操作,保证在一个线程访问Vector时,其他线程不能同时进行写操作。 其次,应该注意避免在迭代器遍历Vector的同时进行修改操作,可能会导致迭代器失效或产生未定义的行为。一种解决方案是使用智能指针,可以在遍历时保持Vector的引用计数,防止迭代器失效。 另外,多线程操作Vector还可以通过分割Vector的部分来实现并行处理,提高程序的执行效率。可以将Vector分割为多个子Vector,每个线程处理一个子Vector的数据,最后再将结果合并。 在使用多线程操作Vector时,还需注意线程间的数据同步和线程安全的问题。可以使用条件变量(condition variable)来实现线程间的通信和同步。同时,应考虑使用原子操作atomic operation)来保证对Vector的操作是原子的,从而避免数据不一致的问题。 总之,多线程操作Vector可以提高程序的性能和并发性,但同时也需要谨慎处理同步控制、迭代器失效和数据同步等问题,以确保线程安全和程序的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值