【问题标题】:java and C++11 volatilejava 和 C++11 易失性
【发布时间】:2012-02-22 12:44:36
【问题描述】:

我想将一些代码从 Java 移植到 C++11,但我对 volatile 关键字有点困惑。

我不熟悉 Java 语言,也不知道什么是 volatile 变量。它保证每个线程都可以访问变量的最新值——这是 C++ volatile 行为。但它通常用于同步 - 对 volatile 变量执行的所有操作都是原子的吗?

所以我认为 Java volatile 的 C++11 良好替代品将是 std::atomic。或者我完全错了,因为我错过了一些额外的 Java volatile 特性?

【问题讨论】:

    标签: java c++ c++11 atomic volatile


    【解决方案1】:

    是的,他们会很相配,Dr Dobbs 上有一篇很好的文章。

    简而言之,有序的原子变量是可以安全读写的 多个线程同时进行而不进行任何显式锁定 因为它们提供了两个保证:它们的读取和写入是 保证按照它们在程序中出现的顺序执行 源代码;并且每次读取或写入都保证是原子的, 全有或全无。

    Java 提供这种类型的变量为volatile,C++ 为std::atomic。

    【讨论】:

    【解决方案2】:

    此页面对 Java 的 volatile 关键字:http://www.javamex.com/tutorials/synchronization_volatile.shtml 有很好的解释。在我看来,原始类型(例如整数)上的 C++11 std::atomic<> 确实是一个很好的替代品。请注意,std::atomic<> 提供对读-修改-写操作的支持(例如,compare_exchange_strong 和 fetch_add)。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2016-05-31
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多