i007.cc

i007.cc

优先队列-降维打击

05.价值资料

有什么高质量的现代 C++ 风格的开源代码?

原文地址

RT想学习学习:)
关注者

3,068

被浏览

645,489

NVIDIA的各种demo,教科书级别的代码,几乎囊括所有新的feature,如果想学习现代图形学的话特别推荐看这个

github.com/nvpro-sample

更多回答

很多答案推荐的开源代码都是大部头,说说我学习现代 C++ 的代码的经历吧。

如果有任何关于 C++ 开发或者职业上的问题,可以点击下面的卡片与我交流:

张小方
25 次咨询

5.0
47309 次赞同
去咨询

我们说的现代 C++ 风格,一般指的是 C++11 及之后的 C++版本,目前比较实用且得到大多数编译器支持的是 C++11/14/17 标准。

1. Filezilla

2016 年的时候,我无意中发现我用了多年的 FTP 软件 Filezilla 竟然用 C++ 11 重写了。

Filezilla界面

FileZilla 的源码是一个德国开发者写的,其代码质量也不错,而且使用的是 C++11 写的。可以一边调试一边学习,学完后,我的 C++11 功能得到了大大增强。

不怕你笑话,我在上学的时候,曾看过 Filezilla 0.x 版本的代码,那个时候 UI 界面用的还是 MFC。

贴一下 Filezilla 的部分代码,红框标出来的部分为 C++11 的语法特性:

代码质量总体很不错。我修改了下让其可以在 Visual Studio 中调试,这样你可以一边调试一边学习。

一套源码如果能够容易编译、调试,同时其业务是容易理解的(通俗地说,就是这套代码的功能是什么的),那么才利于新手学习。

我已经将环境和依赖都配置好了,代码获取链接:

张小方:分享一款 ftp 软件 —— filezilla的源码

2. uWebSocket

uWebSocket 是一款开源的 WebSocket 库,最新版使用了大量 C++17 的语法,代码量非常少。

下载地址:

github.com/uNetworking/

我们改造了这个项目,用于我们的交易系统的行情推送服务器。

3. TeamTalk 的 PC 端

TeamTalk 是蘑菇街开源的一款用于企业内部的即时通信工具,其代码下载地址是:

github.com/balloonwj/Te

学习方法

C++11/14 网上的资料已经很多了,C++17 的资料不多,重头戏还是 C++11 引入的各种实用特性,这就给读者推荐一本我读过的:

  • 《深入理解 C++11:C++11 新特性解析与应用》
  • 《深入应用 C++11:代码优化与工程级应用》
  • C++17 完全指南
  • 《Cpp 17 in Detail》

网上有同学分享出来了:

链接: pan.baidu.com/s/1o46vG8 密码: gqnr

我在我自己的《C++服务器开发精髓》一书的第一章和第三章中也详细地介绍了 C++11/14/17 新增的常用特性和实用方法,有兴趣的读者也可以阅读一下。

完整的书单

我精心整理了一份 C++ 从入门到进阶书单,分享给大家:

只收藏不点赞的都是耍流氓,关注我

 哦~

真诚赞赏,手留余香

1 人已赞赏

赞赏用户

来推荐一个基于C++11 std::function实现的异步调度编程范式:C++ Workflow

是唯一一个CNCF landscapePaaS分类下的C++项目,可见PaaS层的C++项目真的不是很多。如果你想要了解:

  • 高并发、低延迟的网络通信该怎么写;
  • 什么是控制逻辑?PaaS层有哪些控制逻辑?如何让控制逻辑与业务逻辑解耦的?
  • 现代C++在大型项目的使用上有什么需要特别注意的问题?

那么,通过阅读Workflow源码,就可以一次满足你三个愿望啦~~~

这里我用一个例子,来xue微解释一下刚才这三个问题,这个例子就是:怎么实现一个异步server

void process(WFHttpTask *task)
{
	auto *timer = WFTaskFactory::create_timer_task(1000 * 1000,
	    [task](WFTimerTask *timer) {
		task->get_resp()->append_output_body("Workflow slept 1s.");
	});
	series_of(task)->push_back(timer);
}

没有错,server的处理函数已经写完了辣!

不需要调用回复;不需要产生其他执行体去做异步的事情;帮你完成了线程、连接的管理,自带高并发属性;最重要的一点是,代码简洁优美。

以下我给大家解读解读 ~(>^ω^<)

异步server,指的是,网络请求来了之后,我要做事情(假设请求个别的后端、或者读文件、或者做计算、或者调GPU、调QAT加速卡等等任何一种异步事情),我希望可以不占用我server处理入请求的线程去等待这个事情的完成。假设server机器只有8核,如果8个并发过来并且都要读文件,我堵住了当前网络线程的话,就没有办法继续接第9个入请求了。

如何尽可能利用机器所有的异步资源,是Workflow最擅长解决的问题~~~

以上代码示例中是实现睡眠1秒后回复。众所周知sleep会卡住当前线程,所以我们用了一个异步计时任务来模拟任何一种异步任务,等该任务ready了,自动回复这个入请求。

而回到开头的几个问题,我们通过这个例子可以找到什么答案呢?

1.高并发、低延迟的网络通信

Workflow的所有异步资源都任务模式的,得益于这种统一的编程模式,任何异步事件都是可以被组装起来的,所以异步server实现起来就会非常简单。
满足了异步server,自然就可以实现高并发了。无阻塞的调度也是低延迟的保证。

2.PaaS层的控制逻辑如何体现?与业务逻辑如何解耦?

我们这个例子里,不需要关心有多少个线程、多少个连接。如果我们做的异步任务不是定时器,而是访问下游的另一个网络任务,那么对于网络的DNS、负载均衡、ip选取策略这些,都是Workflow层帮封装起来的。这些都是PaaS需要做的许多控制逻辑的其中一小部分。
而开发者只需要实现process()里的逻辑,无需关心怎么回复、怎么起一个执行体等等。

3.现代C++在大型项目的使用上有什么需要特别注意的问题?

仅列两个可以通过这个示例体现的点:
(1) 设计接口,需要注意简洁性
Workflow的接口层是没有模版的。模版不是坏事,但会影响代码美观、以及影响开发者编译时的心情^_^
(2) 内存管理需要特别小心
我们项目中没有使用shared_ptr。C++的内存管理是个大问题,尤其是Workflow这种异步场景,但Workflow有严谨的生命周期管理~开发者所能接触到的task的生命周期,仅仅在process()函数中,而不需要管什么时候被分配,回复完释放之类的事情。

4. 请允许我最后扣题一下:高质量~~~

这里我们看到,做了一个lambda给timer传进去做构造task参数,这个lambda是定时器的回调函数callback,内部是task的一个std::function。而timer任务和其他往下游发送的client任务一样,都是一个主动发起的任务。
而我们这个process()函数,也是一个std::function,server任务是一个被动发起的任务。
并且,不仅是网络,定时任务、计算任务等都可以用同样的方式series->push_back()串起来。
所以我们可以发现:一切都是很对称、很规整的,Workflow用一种统一的方式管理着所有的异步资源。所以Workflow的定位是C++下的编程范式

今天也是Workflow开源一周年了,附上源码链接。一年可以获得超过5000星星,这在C++开源项目里真的非常罕见和难得,绝对值得拿来和大家交流学习~~~

发表回复