Folly

Lambda lifetime explanation for C++20 coroutines

折月煮酒 提交于 2020-03-20 06:16:30
问题 Folly has a useable library for C++20 style coroutines. In the Readme it claims: IMPORTANT: You need to be very careful about the lifetimes of temporary lambda objects. Invoking a lambda coroutine returns a folly::coro::Task that captures a reference to the lambda and so if the returned Task is not immediately co_awaited then the task will be left with a dangling reference when the temporary lambda goes out of scope. I tried to make a MCVE for the example they provided, and was confused about

How to avoid warning when using scope guard?

守給你的承諾、 提交于 2019-12-10 15:39:50
问题 I am using folly scope guard, it is working, but it generates a warning saying that the variable is unused: warning: unused variable ‘g’ [-Wunused-variable] The code: folly::ScopeGuard g = folly::makeGuard([&] {close(sock);}); How to avoid such warning? 回答1: You can disable this warnings by -Wno-unused-variable , though this is a bit dangerous (you loose all realy unused variables). One possible solution is to actually use the variable, but do nothing with it. For example, case it to void:

揭秘Facebook官方底层C++函数Folly

一曲冷凌霜 提交于 2019-12-05 02:02:41
Folly与Boost、当然还有std等组件库的关系是互为补充,而不是彼此竞争。实际上,只有当我们需要的东西既没有,也无法满足所需的性能要求时,我们才开始定义自己的组件。 性能问题贯穿着Folly的大部分,有时导致比较具有特质性的设计(比如PackedSyncPtr.h和SmallLocks.h)。整体上确保良好的性能是所有Folly的统一主题。 逻辑设计 Folly是一组相对独立的组件的集合体,有些组件就是几个符号这么简单。内部依赖方面没有限制,这意味着某个特定的folly模块可以使用其他任何的folly组件。 所有符号都在顶层的命名空间folly中加以定义,当然除了宏。宏名称是ALL_UPPERCASE。命名空间folly定义了其他的内部命名空间,比如internal或detail。用户代码应该不依赖那些命名空间中的符号。 物理设计 在顶层,Folly采用经典的“结巴”(stuttering)方案folly/folly,这也是Boost及其他组件库所采用的。第一个目录充当库的安装根目录(可能是以folly-1.0/这样的形式);第二个目录是添加文件时用来辨别组件库,比如#include "folly/FBString.h"。 目录结构是扁平的(模仿命名空间结构),也就是说我们没有复杂的目录层次结构(这个情况在将来的版本中可能会有变化)

用现代 C++ 写一个高性能的服务器

落花浮王杯 提交于 2019-12-03 07:08:09
本文由 伯乐在线 - 袁欣 翻译, 艾凌风 校稿。未经许可,禁止转载! 英文出处: James Perry 。欢迎加入 翻译组 。 首先感谢大家对上一篇博文《 用 C++ 开启技术创业之旅 》的反馈。在上篇文章中我提到我曾在一天内就凭借 Facebook 的 Wangle 搭建起一个数据库引擎的原型,在这里我会解释我是如何做到的。到本文最后,你将可以用 Wangle 编写出一个高性能的C++服务器。本文也将作为教程整合进 Wangle 的 ReadMe.md 中。 我将展示如何使用现代C++编写一个Echo服务器,相当于分布式系统开发中的“Hello World”。这个服务器会将接收的消息直接返回。我们同时需要一个可以向我们的服务器发动消息的客户端,在这里可以发现客户端的 源码 。 Wangle是一个用来搭建事件驱动的现代异步C++服务的C/S应用框架。Wangle最基本的抽象概念就是Pipeline(管线)。能够理解这种抽象,将会很容易写出各种复杂的现代C++服务,另一个重要的概念是Service(服务),其可以看作一种更高级的Pipeline,不过超出了本文我们关注的范畴。 PipeLine pipeline 是 Wangle 中最重要也是最强大的抽象,可以让用户在定制 request 和 response 的实现时拥有很大的自由。一个pipeline就是一系列request

Wangle源码分析:Pipeline、Handler、Context

谁说我不能喝 提交于 2019-12-01 22:47:49
基本概念 Wangle中的Pipeline和Netty中的Pipeline是很相似的,既可以将它看为一种职责链模式的实现也可以看作是Handler的容器。Pipeline中的handler都是串行化执行的,前一个handler完成自己的工作之后把事件传递给下一个handler,理论上Pipeline中的所有handler都是在同一个IO线程中执行的,但是为了防止某些handler(比如序列化、编解码handler等)耗时过长,Netty中允许为某些handler指定其它线程(eventloop)异步执行,类似的功能在Wangle中也有体现,只是在实现方式上有些区别。和Netty中一个较大的区别是,Wangle中并没有专门的Channel定义,Wangle中的Pipeline兼有了Channel的角色和功能。下面分别就Pipeline、Handler和Context的顺序进行源码分析。 Pipeline PipelineBase作为Pipeline的基类,提供了一些最为通用、核心的api实现,比如对handler的操作:addBack及其变体、addFront及其变体、remove及其变体等,下面看一下addBack的一个实现版本: template <class H> PipelineBase& PipelineBase::addBack(std::shared_ptr<H>