c++ - 用非原子更新原子变量,反之亦然
问题描述
我正在使用一个线程更新原子变量 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();
}
问题:
但正如你所看到的,我正在更新
m_atomic_val
哪个是非原子std::atomic<size_t>
的。size_t
这会产生不好的影响吗?这是非法的吗?的返回类型
GetVal
是size_t
但它返回 astd::atomic<size_t>
。这是错的吗?所以,我的主要问题是原子和非原子变量的混合允许我在示例代码中做的方式吗?
这只是一个简单的例子来证明我的问题。如果有一个写入线程和一个读取线程同时运行并且很可能出现竞争条件怎么办?我应该改用互斥锁而不是原子吗?
环境:
我的代码在 iOS、Android 和 macOS 上运行。
解决方案
推荐阅读
- swift - ARC 如何作用于强制展开的实例
- php - 数组与同一年合并
- firebase - 身份验证用户的firebase实时数据库规则
- node.js - 为什么 NodeJS 说数组是对象?
- javascript - jQuery/Javascript 计算月、周、日、小时、分钟和秒的两个日期之间的差异
- mysql - 使用每列的 isVisible 值实现数据库结构
- javascript - 内容固定时通过触摸或滚动导航
- reactjs - 在渲染到屏幕之前对内存中的视频加载做出反应
- ruby-on-rails - 无法在 Heroku 上的 R 中写入绘图的 png
- php - Laravel 从分页中获取所有项目的数据