c++ 多线程笔记4

参考来源:ttps://baptiste-wicht.com/posts/2012/07/c11-concurrency-tutorial-part-4-atomic-type.html

本文介绍c++并发库中的原子类型: Atomic types.

1. Atomic Types

struct Counter {
    int value;
    
    void increment(){
        ++value;
    }
    
    void decrement(){
        --value;
    }
    
    int get(){
        return value
    }
};

我们可以看到这个类在多线程环境中使用不是很安全。我们可以使用互斥锁来使得这个类的安全。

将介绍原子类型。原子类型的主要的优势是它的操作,这个std::atomic操作的执行无需锁操作并且比锁操作更快。

C++11并发库将原子类型作为一个模板类 std::atomic。你可以用模板实现任何你想要的类型,实现原子操作和线程安全。

主要函数std::atomic提供的是store和load函数,能够实现原子设置和得到std::atomic的内容。

另一个有趣的函数是exchange,能够给atomic设置一个新的值并且返回atomic的之前的值。

最后,还有两个函数compare_exchange_weak和compare_exchange_strong能够在这个值和提供的期望值相等时执行原子交换。

最后这两个函数在无锁算法中能被执行。

std::atomic时专门为所有的整数类型提供成员函数。

很容易使得Counter类安全使用std::atomic。

#include <atomic>

struct AtomicCounter {
    std::atomic<int> value;

    void increment(){
        ++value;
    }

    void decrement(){
        --value;
    }

    int get(){
        return value.load();
    }
};

建议在需要的时候使用std::atomic去做原子操作,尤其在对整数类型做处理时。

猜你喜欢

转载自www.cnblogs.com/Shinered/p/9084960.html