C++多线程——原子操作atomic
1. 原子操作 1.1 示例 原子操作 是个不可分割的操作。 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的; 它要么就是做了,要么就是没做,只有这两种可能。 不使用原子操作: # include <iostream> # include <thread> # include <atomic> using namespace std ; long num = 0 ; void addnum ( ) { for ( int i = 0 ; i < 100000 ; i ++ ) num ++ ; //不对全局变量进行互斥访问 } int main ( ) { int nthreads = 2 ; thread t [ nthreads ] ; for ( int i = 0 ; i < nthreads ; i ++ ) t [ i ] = thread ( addnum ) ; for ( auto & th : t ) th . join ( ) ; cout << num << endl ; return 0 ; } 输出结果: 最终结果为 109515 ,这个结果小于 200000 ,说明在对全局变量进行写的时候出现了下面的情况: 明明加了两次,但是因为访问不是互斥的,从而导致实际的值小。 使用原子操作可以避免这种情况的发生