【问题标题】:Is there a way to reuse std::atomic on a given int32_t?有没有办法在给定的 int32_t 上重用 std::atomic?
【发布时间】:2020-03-04 11:55:41
【问题描述】:

我有一个初始值为 42 的int32_t。现在我希望它可以被多个线程原子地访问。

#include <atomic>

using namespace std;
int32_t* pn{};

int main()
{
    pn = getPtrFromMmap();    
    assert(42 == *pn); // note that *pn is mapped to a disk file

    // How to make the following two threads access *pn atomically?
    std::thread{[&]{ (*pn)++; }}.detach(); 
    std::thread{[&]{ (*pn)++; }}.detach();
}

编写一个正确的原子操作类并非易事。所以,我尝试使用std::atomic 来实现我的目标,但失败了。

有没有办法在这种情况下重用std::atomic

【问题讨论】:

  • 不使用std::atomic,为什么不简单地使用其他线程同步原语,比如互斥锁和锁?
  • 如果您 100% 确定变量不会被外力改变,只需将其复制到原子中,并在一切完成后复制回来。否则,你已经有竞态条件了,所以你需要更新底层代码
  • @Someprogrammerdude,std::atomicstd::mutex 性能更高。
  • @JVApen,copy-write-restore是不行的,因为内存地址映射到一个磁盘文件,也就是pagecache中。即使进程崩溃,pagecache中的数据也可以;而在这种情况下,变量中的副本将丢失。
  • 所以你想要一个对易失整数的原子引用?

标签: c++ multithreading c++11 mutex atomic


【解决方案1】:

没有。

大致认为std::atomic

template <typename T>
class atomic {
    T value;
public:
    // a bunch of member functions
};

std::atomic&lt;int32_t&gt; 包含 int32_t

你需要的是一个

template <typename T>
class atomic_ref {
    T & ref;
public:
    // a bunch of member functions
};

这种类型不是std::的成员。

在 C++17 中,std::atomic&lt;std::reference_wrapper&lt;T&gt;&gt; 保证有效,但在这里没有帮助。对所指对象的操作不是原子的。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多