[英]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
的返回類型是size_t
但它返回一個std::atomic<size_t>
。 這是錯誤的嗎?
所以,我的主要問題是原子和非原子變量的混合允許我在示例代碼中做的方式?
這只是一個簡單的例子來演示我的問題。 如果有一個寫入線程和一個讀取線程並發運行並且很可能出現競爭條件怎么辦? 我應該改用互斥體而不是原子嗎?
環境:
我的代碼在 iOS、Android 和 macOS 上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.