C++17 std::shared_mutex 还没有吗?
Is C++17 std::shared_mutex not available yet?
查看 C++ compiler support,std::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 上试过了并且成功了。
查看 C++ compiler support,std::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 上试过了并且成功了。