首页 > 解决方案 > 用非原子更新原子变量,反之亦然

问题描述

我正在使用一个线程更新原子变量 size_t 并从另一个线程读取它。以下是代码:

代码:

// MyClass.hpp
#pragma once
#include <atomic>

class MyClass {
public:
    size_t GetVal() {
        return m_atomic_val;
    }

    void SetVal(const std::size_t val) {
        m_atomic_val = val;
    }

private:
    std::atomic<size_t> m_atomic_val{0};
};


// main.cpp
#include "MyClass.hpp"

#include <iostream>
#include <thread>

int main() {
    MyClass obj;
    obj.SetVal(4);

    std::thread my_thread = std::thread([&obj]{
       std::cout << "Thread started" << std::endl;
       std::this_thread::sleep_for(std::chrono::milliseconds(30));
        obj.SetVal(8);
    });

   std::this_thread::sleep_for(std::chrono::seconds(2));
   auto val = obj.GetVal();
   std::cout << "The value is: " << val << std::endl;
   my_thread.join();
}

问题:

环境:
我的代码在 iOS、Android 和 macOS 上运行。

标签: c++multithreadingatomicstdthreadstdatomic

解决方案


对原子对象的赋值将接受任何正确类型的值。

由于您有一个,因此(或可以隐式转换为)a的std::atomic<size_t>任何值或变量size_t都可以在赋值的右侧使用。

至于GetVal问题,std::atomic有一个转换运算符会做正确的事情,原子地获取值并将其提供给您以返回。

关于GetVal函数的另一个注意事项:它只会获取原子的值,而不是原子的return。因此,在 fetch 和实际return值之间m_atomic_val可以更改,但会返回旧值。


推荐阅读