用非原子变量更新原子变量,反之亦然
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();
}
问题:
但是如您所见,我正在更新 m_atomic_val
,这是一个 std::atomic<size_t>
和一个非原子的 size_t
。这会不会有不好的影响?这是违法的吗?
GetVal
的 return 类型是 size_t
但它的 return 是 std::atomic<size_t>
。这是错误的吗?
所以,我的主要问题是原子变量和非原子变量的混合是否允许我在示例代码中执行的操作?
这只是一个简单的例子来说明我的问题。如果有一个 writer 线程和一个 reader 线程并发 运行 并且很可能出现竞争条件怎么办?我应该改用互斥锁而不是原子锁吗?
环境:
我的代码在 iOS、Android 和 macOS 上运行。
Assignment 到原子对象将接受正确类型的任何值。
因为你有一个 std::atomic<size_t>
那么任何值 或变量 是(或可以隐式转换为)一个 size_t
可以在作业的右侧。
至于 GetVal
问题,std::atomic
有一个 conversion operator 会做正确的事情,自动获取值并为 return 提供给你.
关于 GetVal
函数的另一个注意事项:它只会是原子值的获取,它的 return
不是。因此,在提取和实际 return
之间,m_atomic_val
的值可以更改,但旧值将被 returned。
我正在更新一个原子变量 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
的 return 类型是size_t
但它的 return 是std::atomic<size_t>
。这是错误的吗?所以,我的主要问题是原子变量和非原子变量的混合是否允许我在示例代码中执行的操作?
这只是一个简单的例子来说明我的问题。如果有一个 writer 线程和一个 reader 线程并发 运行 并且很可能出现竞争条件怎么办?我应该改用互斥锁而不是原子锁吗?
环境:
我的代码在 iOS、Android 和 macOS 上运行。
Assignment 到原子对象将接受正确类型的任何值。
因为你有一个 std::atomic<size_t>
那么任何值 或变量 是(或可以隐式转换为)一个 size_t
可以在作业的右侧。
至于 GetVal
问题,std::atomic
有一个 conversion operator 会做正确的事情,自动获取值并为 return 提供给你.
关于 GetVal
函数的另一个注意事项:它只会是原子值的获取,它的 return
不是。因此,在提取和实际 return
之间,m_atomic_val
的值可以更改,但旧值将被 returned。