用非原子变量更新原子变量,反之亦然

Updating an atomic variable with a non atomic and vice versa

我正在更新一个原子变量 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 上运行。

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

因为你有一个 std::atomic<size_t> 那么任何值 或变量 是(或可以隐式转换为)一个 size_t 可以在作业的右侧。

至于 GetVal 问题,std::atomic 有一个 conversion operator 会做正确的事情,自动获取值并为 return 提供给你.

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