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

ale*_*ind 7 c++ mutex libstdc++ gcc5 c++17

看看C++编译器支持,似乎std::shared_mutexGCC 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_;
Run Code Online (Sandbox Code Playgroud)

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

它找不到合适的标题,因为它似乎不存在.实际上,链接器使用的是locate at /usr/include/c++/5/shared_mutex,它只包含了实现std::shared_timed_mutex(如C++ 14标准).

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

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

Jon*_*ely 11

关于cppreference的混淆可能是因为std::shared_mutex真正添加到GCC 5.0,修订版200134.但这是基于C++ 1y草案的那种类型的早期化身.实际上它是当时被调用的定时共享互斥锁 std::shared_mutex.

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

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

然后,在GCC 6.x发布系列的开发过程中,添加了C++ 1z untimed共享互斥锁,重用了该std::shared_mutex名称.这是上面评论中修订版224158中提交TC的提交.

所以C++ 17 untimed shared_mutex从未出现在任何GCC 5.x版本中.在第一个5.x版本发布之前的一段时间里,有一个被调用的定时版本std::shared_mutex,但是在所有正确的5.x版本中它被称为std::shared_timed_mutex.

2016年4月,第一个发布C++ 17不定时版本的版本是6.1.

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