C++17 std::shared_mutex 还没有吗?

Is C++17 std::shared_mutex not available yet?

查看 C++ compiler supportstd::shared_mutex 的未计时版本似乎在 GCC 5.0+ 中可用。但是,即使使用 gcc version 5.3.0 20151204 (Ubuntu 5.3.0-3ubuntu1~14.04) 并使用 -std=c++1z 进行编译,共享互斥锁的简单初始化也会以:

结束
error: ‘shared_mutex’ in namespace ‘std’ does not name a type
        std::shared_mutex mutex_;

不,我已经包含了正确的 header:#include <shared_mutex>

找不到正确的 header,因为它似乎不存在。 实际上,链接器使用了位于 /usr/include/c++/5/shared_mutex 的库,其中仅包含 std::shared_timed_mutex 的实现(类似于 C++14 标准)。

我已经通过在 ppa:ubuntu-toolchain-r/test 添加存储库并使用 update-alternatives 正确设置它们的垃圾箱来安装 gcc-5 和 g++-5。

我可以做些什么来使用最新的 C++17 标准正确编译我的代码吗?并且可能是一个愚蠢的问题,但现在开始使用 -std=c++1z 是否为时过早,即使它应该已经得到支持?因为支持,对吧?

对 cppreference 的混淆可能是因为 std::shared_mutex 实际上 添加到 revision 200134 的 GCC 5.0。但那是基于 C++1y 草案的该类型的早期版本。实际上是 timed shared mutex,当时叫 std::shared_mutex.

在最终的 C++14 标准发布之前 std::shared_mutex 被重命名为 std::shared_timed_mutex,因此在 GCC 5.1 发布之前(这是 5.x 系列中的第一个版本) libstdc++ 中的类型已重命名,请参见 revision 207964.

因此,虽然在 GCC 5.x pre-release 阶段的某一时刻有一个 std::shared_mutex 类型,但它不是 C++17 未计时的类型,它被重命名了在出现在 GCC 的任何官方版本中之前。

然后,在 GCC 6.x 发布系列的开发过程中,添加了 C++1z 非定时共享互斥锁,重新使用了 std::shared_mutex 名称。那就是提交 T.C。链接到上面的评论,revision 224158.

所以 C++17 untimed shared_mutex 从来没有出现在任何 GCC 5.x 版本中。在第一个 5.x 版本之前的一小段时间里,有一个 定时 版本称为 std::shared_mutex,但在所有适当的 5.x 版本中它被称为 std::shared_timed_mutex.

第一个发布 C++17 未计时版本的版本是 2016 年 4 月的 6.1,因此对于之后的任何 GCC 版本,您都可以使用 std::shared_mutex(只要您在编译器,例如使用 -std=gnu++17-std=c++17 标志)。

GCC 5 于 2015 年发布,因此期望能够在该版本上使用 C++17 有点不现实。 GCC 6.x 和 7.x 有很好的 C++1z 支持(当然,只是基于发布时的当前草稿)。

按照这个 link 到 install/upgrade 到最新版本的 GCC 和 G++。 http://tuxamito.com/wiki/index.php/Installing_newer_GCC_versions_in_Ubuntu

我已经在我的 ubuntu 上试过了并且成功了。