踩坑一处(GCC)STL `std::async` 实现BUG导致的crash问题
前言
近期发现项目组使用新版本的 opentelemetry-cpp 的时候偶现崩溃。崩溃的位置在STL的 std::future
析构的地方,而这个 std::future
由 std::async
创建。
比较违反直觉,这里记录分享一下分析和解决过程方面其他碰到的小伙伴们。
近期发现项目组使用新版本的 opentelemetry-cpp 的时候偶现崩溃。崩溃的位置在STL的 std::future
析构的地方,而这个 std::future
由 std::async
创建。
比较违反直觉,这里记录分享一下分析和解决过程方面其他碰到的小伙伴们。
之前的版本发完,有空来更新一下之前的gcc和llvm+clang工具链的编译脚本了。其实GCC 7是才release没多久但是llvm 4.0发布其实有一段时间了。
经过茫茫长时间的编写+过年在家无聊补充和修正单元测试,再加上这两天的整理,终于把以前的这个关于服务器通信中间件的基本功能和相应的单元测试完成啦。还是可以热烈庆祝一下的。
记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。
在项目中碰到的实例的大致流程是:
Github地址: https://github.com/owent/libiniloader
OSChina镜像: http://git.oschina.net/owent/libiniloader
项目中经常会碰到需要读取配置的情况,而用ini配置最大的优势就是简单易懂。 但是现在很多的配置读取库都过于庞大了,比如Boost.PropertyTree,功能很强大,但是基本不会用到里面所有的东西。 另外微软的INI读取,功能不是很强不说,还限制在Windows上,更重要的是API设计得实在不优雅。 于是libiniloader就诞生啦。
C++ 11 标准发布,各大编译器都开始支持里面的各种新特性,其中一项比较有意思的就是lambda表达式。
C++ 11 Lambda表达式的四种声明方式
今年准备安安心心写一个协程库。一方面是觉得协程挺有意思,另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。 按照我自己风格还是喜欢C++,所以协程库定名为 libcopp 。 源码托管在 github: https://github.com/owent/libcopp 镜像托管 http://git.oschina.net/owent/distinctionpp
C++11标准里有动态模板参数已经是众所周知的事儿了。但是当时还有个主流编译器还不支持。 但是现在,主要的编译器。VC(Windows),GCC(Windows,Linux),Clang(Mac,IOS)都已经支持了。所以就可以准备用于生产环境了。 type_traits没啥好说的。主要是一些静态检测。主要还是要看动态模板参数和他们两的结合使用上。 动态模版参数标准文档见: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf 和 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf 虽然贴出来了。估计是没人看得。所以就直接说重点。
使用代码生成代码是一件十分美妙的事情,于是有了各种代码生成器。但是生成代码,意味着要有对生成规则的分析和处理。 Boost.Spirit 就是这么一个语法分析工具,它实现了对上下文无关文法的LL分析。支持EBNF(扩展巴科斯范式)。 Boost.Spirit 的使用真的是把模板嵌套用到了极致。确实这么做造成了非常强的扩展性,生成的代码也非常高效,但是嵌套的太复杂了,对于初学者而言真心难看懂。 你能想象在学习阶段一个不是太明白的错误导致编译器报出的几十层模板嵌套错误信息的感受吗?而且,这么复杂的模板嵌套还直接导致了编译速度的巨慢无比。 其实在之前,我已经使用过Spirit的Classic版本,即1.X版本,但是过多的复制操作让我觉得当时用得很低效,还好分析的内容并不复杂所以没。体现出来 这回就来研究下功能更强劲的2.X 版本。
C++11的新标准已经出台,各个编译器已经开始陆续支持。 主流编译器支持程度见(VC++, gcc, clang, intel c++等):http://en.cppreference.com/w/cpp/compiler_support
但是要让C++11应用与生产环境还需时日,所以就在这里记录一下在过渡时期可能用到的一些重要功能
这各部分主要是一些很实用和在一些地方帮助编译器自动推断类型的库和函数 首先是引用包装 类名 template< class T > class std::reference_wrapper; 这个类保存了对一个类实例、(成员)函数(指针) 构造时必须传入所引用的对象或引用对象的右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标类的引用类型 get方法, 用于获取引用的对象 ()操作符, 用于执行引用的函数
绑定函数是我认为C++新标准里第二有用的库了 绑定库的使用环境是:
先来看一段代码
C++ STL终于会放点实用的东西了。可喜可贺。
这个,显然是正则表达式库,作为一个强大而又NB的库,我表示对其理解甚少,只能先研究下基本用法,更具体的用法要等实际应用中用到的时候在细看了。 PS:正则表达式的资料见 http://www.regexlab.com/ 更多资料见 https://www.owent.net/2011/264.html
这回的两个库没怎么用过,这里的记录就用VC++写了,使用G++和BOOST的时候和智能指针类似。
首先是Tuple库
要注意的是这里G++,VC++和BOOST库的函数不太一样,所以使用的时候要注意没有使用到编译器和编译器相关的函数(特别是IDE的弹窗的方法要注意)。
C++ 0x/11 终于通过了,真是个很爽的消息。于是乎我决定对新的东西系统学习一下。
首先当然要从tr1开始,智能指针实际上我已经用过很多次了,但是为了完整起见,还是写出来记录一下。
网站及网页:
基本知识中文学习站(中):http://www.w3school.com.cn
W3C官网(英):http://www.w3.org/
HTML 4.01规范(英):http://www.w3.org/TR/html4/
XHTML™ 1.1规范(英):http://www.w3.org/TR/xhtml11/
CSS官方文档(多国语言):http://www.w3.org/Style/CSS/