C++11 之 多线程中的原子操作

简介:

原子操作指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。

这意味着不需要额外的同步机制(比如显示加锁)就可以执行并发的读写操作。

原子类型:

C++11 之 多线程中的原子操作

示例代码:

#include <iostream>
#include <atomic>
#include <thread>

using namespace std;

void addAtomic( atomic<int> &num )
{
    for( int i = 0; i < 1000; i++ )
    {
        ++num;
        this_thread::sleep_for( chrono::milliseconds( 1 ) );
    }
}

void add( int &num )
{
    for( int i = 0; i < 1000; i++ )
    {
        ++num;
        this_thread::sleep_for( chrono::milliseconds( 1 ) );
    }
}
int main()
{
    cout << "原子类型VS普通类型\n";
    int nCount = 0;
    thread t1( add, ref( nCount ) );
    thread t2( add, ref( nCount ) );
    t1.join();
    t2.join();

    atomic<int> aCount( 0 );
    thread t3( addAtomic, ref( aCount ) );
    thread t4( addAtomic, ref( aCount ) );
    t3.join();
    t4.join();

    cout << "普通类型:" << nCount << endl;
    cout << "原子类型:" << aCount << endl;

    cout << "\n原子操作(fetch_add为例)说明:\n";
    atomic<int> am( 100 );
    auto ret = am.fetch_add( 100 ); //fetch_add返回原始值

    cout << "am=" << am << endl;
    cout << "ret=" << ret << endl;

    auto ret2 = am.fetch_add( 100 );

    cout << "am=" << am << endl;
    cout << "ret=" << ret2 << endl;

    system( "pause" );
    return 0;
}

运行结果:

C++11 之 多线程中的原子操作