C++中 atomic和mutex的效率

01 引

由于“哪怕是对一个bool型变量的赋值和读取都不保证原子性“,所以在并发环境下,操作可能产生Data Race的变量需要人为的加以保护。

常用的措施

  • 用互斥量mutex的包裹的临界区。
  • 利用atomic方式,赋予其原子性。

那么这两种措施效率如何呢?

02 比对结果

  • mutex互斥量
    • time: 1.76376e+06
      5000000
  • atomic形式
    • time: 308277
      5000000

可以得出结论,atomic的形式的效率在临界区操作不复杂的情况下,要比互斥量的效率高很多。

03 Show me the code

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


using namespace std;

// atomic variable
//atomic at_var;
// normal global variable
unsigned long at_var;

// mutex
mutex var_mutex;


// function for each thread's call
void add_num(const int num) {
    for (int i = 0; i < num; ++i) {
        lock_guard<mutex> lg(var_mutex);
        at_var += 1;
    }
//    cout << this_thread::get_id() << endl;
}


int main() {
  	// start time point
    float time_start = clock();
		// set threads num and each thread's add var
    const int MAX_THREAD_NUM = 100;
    const int ADD_ONE = 50000;
		
  	// use boost's to create a "thread pool"
    boost::thread_group threads;
		
    for (int i = 0; i < MAX_THREAD_NUM; ++i) {
        threads.create_thread(boost::bind(add_num, ADD_ONE));
    }
		
  	// main thread waits all threads done
    threads.join_all();
		
    cout << "time: " << clock() - time_start << endl;
    cout << at_var << endl;

    return 0;
}

你可能感兴趣的:(C++)