RL的src/rl/std解读
前言
在上一次分析源码中,我们先看了cmakefile文件,从这一行
set(RL_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/rl/std)
我们得知rl先从这里进行编译,那么我们来仔细看看这里到底说的什么
开始
rl的std下分为这几个文件,分别是:chrono、condition_variable、future、iterator、mutex、random、regex、string、thread以及一个cmakelists文件。
编写这些文件的原因是这个项目采用的标准可以支持到cpp的0x标准、而有些特性项目采用了,但是不在c++标准中,而且又由于它们都属于未来的cpp标准的文件,所有采用这种方式将这些文件导入,算是一种折中的办法。
chrono
这个代码比较简单,我们直接看全部的源码:
#ifndef RL_STD_CHRONO
#define RL_STD_CHRONO
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918
#include <../include/chrono>
#elif defined(_MSC_VER)
#include <boost/chrono.hpp>
namespace std
{
namespace chrono = ::boost::chrono;
}
#else // _MSC_VER
#include_next <chrono>
#if __GNUC__ == 4 && __GNUC_MINOR__ < 7 && !__clang__
namespace std
{
namespace chrono
{
typedef monotonic_clock steady_clock;
}
}
#endif // __GNUC__
#endif // _MSC_VER
#endif // RL_STD_CHRONO
总的来说就是如果采用的是msvc编译器,则判断msvc编译器是否到了190023918版本,然后如果到了直接使用std的这个头文件,否则就使用boost的这个chrono头文件,下面的else则是一样的,如果不是msvc编译器,也不是clang编译器,并且gcc的编译器版本在gcc4和gcc7之间则使用将monotonic_clock
定义为steady_clock
,可能是因为这时候这个特性没有实现。
condition_varianle
这里也是一样的,检测是否有msvc编译器和其版本,然后判断是有这个头文件,没有则使用boost的头文件。这个头文件主要是是与std::mutex
一起使用的同步语句,可以用来用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 std::condition_variable
,就是一个条件堵塞时候用的。
namespace std
{
using ::boost::condition_variable;
using ::boost::condition_variable_any;
using ::boost::cv_status;
using ::boost::notify_all_at_thread_exit;
}
我们主要看一下核心的部分,主要是用到了四种条件变量的特性。这些特性均在c++11中实现完成了。所有我们不需要过多在意。
future
这里的future也是一样的,但是future在c++20中得到了加强。
-
std::jthread
支持:C++20 引入了std::jthread
,它是一个更高级的线程类,能够自动管理线程的生命周期。这使得与std::future
结合使用时,线程管理变得更加简单。 -
std::stop_token
和std::stop_source
:C++20 引入了std::stop_token
和std::stop_source
,用于更优雅地停止异步操作。这些新特性可以与std::future
结合使用,以便在需要时安全地停止异步任务。 -
改进的异常处理:C++20 对异常处理进行了改进,使得在异步操作中捕获和处理异常更加方便和可靠。
-
std::shared_future
:虽然std::shared_future
在 C++11 中已经存在,但 C++20 对其进行了改进,使其在多线程环境下的性能和安全性更高。
regex
正则表达式是一个非常比较有意思的库,在std中的regex性能比较低,甚至其慢到比很多脚本语言执行的regex慢很多倍,甚至可能有非常大的性能差距,直到今天还是有很大的问题,所有我们最好采用别的regex库,
#if (defined(_MSC_VER) && _MSC_VER < 1600) || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)
#include_next <boost/regex.hpp>
namespace std
{
using ::boost::basic_regex;
using ::boost::cmatch;
using ::boost::csub_match;
using ::boost::match_results;
using ::boost::regex;
using ::boost::regex_match;
using ::boost::regex_search;
using ::boost::regex_replace;
using ::boost::smatch;
using ::boost::sub_match;
using ::boost::ssub_match;
using ::boost::wcmatch;
using ::boost::wcsub_match;
using ::boost::wregex;
using ::boost::wsmatch;
using ::boost::wssub_match;
}
如果编译器是 Microsoft Visual C++ (MSC_VER) 版本小于 1600,或者是 GNU 编译器 (GCC) 版本 4 且小版本小于 9,那么就包含 boost/regex.hpp 头文件。
然后在 std 命名空间中,使用 boost 命名空间中的正则表达式相关类和函数。其他的话就采用std本身的regex,之后我们进行代码修改时候应该将std的库改成boost的。
其他库
其他库和上面一样,就是判断是否编译器支持c++11,然后就导入标准库,否则就使用boost里面的库。