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

问题描述 投票:5回答:1

看看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_;

不,我已经包括了正确的标题:#include <shared_mutex>

它找不到合适的标题,因为它似乎不存在。实际上,链接器使用位于/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还为时尚早?因为它受到支持,对吗?

c++ mutex libstdc++ c++17 gcc5
1个回答
11
投票

关于cppreference的混淆可能是因为std::shared_mutex真的被添加到Gaz 5.0,在revision 200134。但这是基于C ++ 1y草案的那种类型的早期化身。事实上,它是定时共享的互斥锁,当时称为std::shared_mutex

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

因此,尽管在GCC 5.x预发布阶段期间有一个std::shared_mutex类型,但它不是C ++ 17不定时类型,并且在出现在GCC的任何正式版本之前它已被重命名。

然后,在GCC 6.x发布系列的开发过程中,添加了C ++ 1z untimed共享互斥锁,重用了std::shared_mutex名称。这是提交T.C.与上述评论相关联,revision 224158

因此,C ++ 17不定时shared_mutex从未出现在任何GCC 5.x版本中。在第一次5.x版本发布之前的短暂时间内,有一个名为std::shared_mutex的定时版本,但在所有正确的5.x版本中,它被称为std::shared_timed_mutex

2016年4月发布的第一个发布C ++ 17 untimed的版本是6.1,所以在之后的任何GCC版本中你可以使用std::shared_mutex(只要在编译器中启用C ++ 17,例如使用-std=gnu++17-std=c++17标志)。

GCC 5于2015年发布,因此期望能够在该版本中使用C ++ 17有点不切实际。 GCC 6.x和7.x具有相当不错的C ++ 1z支持(当然,仅基于发布时的当前草稿)。


0
投票

点击此链接安装/升级到最新版本的GCC和G ++。 http://tuxamito.com/wiki/index.php/Installing_newer_GCC_versions_in_Ubuntu

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

© www.soinside.com 2019 - 2024. All rights reserved.