std::atomic和std::mutex的区别

The difference btween std::atomic and std::mutex

how to use std::atomic<>

在上面的问题中,显然我们可以只使用std::mutex来保持线程安全。我想知道什么时候用哪个。

classs A
{
    std::atomic<int> x;

public:
    A()
    {
        x=0;
    }

    void Add()
    {
        x++;
    }

    void Sub()
    {
        x--;
    }     
};

std::mutex mtx;
classs A
{
    int x;

public:
    A()
    {
        x=0;
    }

    void Add()
    {
        std::lock_guard<std::mutex> guard(mtx);
        x++;
    }

    void Sub()
    {
        std::lock_guard<std::mutex> guard(mtx);
        x--;
    }     
};

根据经验,对 POD 类型使用 std::atomic,其中底层特化将能够使用一些聪明的东西,比如 CPU 上的总线锁(这不会给你更多的开销比管道转储),甚至是自旋锁。在某些系统上,int 可能 已经 是原子的,因此 std::atomic<int> 将有效地专注于 int.

对非 POD 类型使用 std::mutex,请记住获取互斥量至少比总线锁慢一个数量级。

如果您仍然不确定,请测量性能。