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

标签 multithreading c++11 thread-safety mutex stdatomic

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--;
    }     
};

最佳答案

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

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

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

关于multithreading - std::atomic 和 std::mutex 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39617208/

相关文章:

c# - 在Windows上,C#在数据到达之前或之后,Socket.BeginReceive()是否占用后台线程?

c++ - 堆栈中的最佳复杂性交换元素

c++ - const 引用转换为非常量后的行为

c# - 在设置参数之间获取数字的线程安全数字生成器方法?

c++ - 子字大小标志的线程安全

multithreading - 系统.InvalidCastException : Specified cast is not valid

Python多处理类型错误: join() takes exactly 1 argument (2 given)

c# - 如何使事件回调进入我的 win 表单线程安全?

c++ - 三个原子变量上的 CompareAndExchange

c# - Windows服务中的多线程