C++ 原子操作 std::atomic<int>

Posted 软件工程小施同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 原子操作 std::atomic<int>相关的知识,希望对你有一定的参考价值。

std::atomic<T>模板类可以使对象操作为原子操作,避免多线程竞争问题;请看如下代码,一目了然

class Test
{
public:    
    Test() = default;

    void CThreadFunc()
    {
        for (int i = 0; i < 10000; ++i)
        {
            //std::lock_guard<std::mutex> lck(Test::m_s_ivalue_mutex); //m_iValue需要加锁才可正常工作
            m_iValue++;

            m_atomic_value++;//不加锁,也可正常工作
        }
    }

    void Start()
    {
        std::vector<std::thread> threads;
        for (int i = 0; i < 10; ++i)
        {
            threads.push_back(std::thread(&Test::CThreadFunc, this));
        }

        for (auto& th : threads)
        {
            if (th.joinable())
            {
                th.join();
            }
        }     
        std::cout << "m_iValue:" << m_iValue << ", m_atomic_value:" << m_atomic_value << std::endl;
    }

private:
    int m_iValue = 0;
    std::atomic<int> m_atomic_value = 0;//sta::atomic<T> 原子操作
    static std::mutex m_s_ivalue_mutex;
};

执行:

Test test;
test.Start();

https://www.cnblogs.com/fluteary/p/9187207.html 

以上是关于C++ 原子操作 std::atomic<int>的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 std::atomic<int64> 放在共享内存中并期望原子操作吗?

一个关于原子操作的问题及其 c++ 说明

std::atomic_ref 如何为非原子类型实现?

C++多线程

“行动中的并发”原子操作示例的正确性

C++ 中多个值的多线程原子存储/加载