簡體   English   中英

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

[英]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 上運行。

對原子對象的賦值將接受任何正確類型的值。

由於您有一個std::atomic<size_t>那么任何是(或可以隱式轉換為) size_t或變量都可以在賦值的右側使用。

至於GetVal問題, std::atomic有一個轉換運算符,它會做正確的事情,以原子方式獲取值並將其提供給您以供返回。

關於GetVal函數的另一個注意事項:它只會獲取原子性的值,而不會return它。 因此在獲取和實際return之間, m_atomic_val的值可以改變,但將返回舊值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM