我在写grpc的实例时, 需要使用一个多线程的hash map, C++标准库中没有多线程的hash map, facebook开源的folly中存在大量的基础类, 中间存在一个高性能的hash map,这个正是我所需要的, 所以在这里简介一下folly库, 按照官方说明, folly库安装需要gcc 5.1+ 和支持C++14的编译器编译的boost.

在安装folly之前, 还需要安装google的glog, glog的github仓库在:

https://github.com/google/glog

可以从https://github.com/google/glog/releases下载一个release包, 然后使用如下的命令进行安装:

./autogen.sh && ./configure && make && make install # may use sudo

通过上述方式安装的glog是动态库, 在使用folly库的时候, 很多时候可能需要用到glog.

folly库的github仓库地址在:

https://github.com/facebook/folly.git

其中我需要使用的ConcurrentHashMap在folly/folly/concurrency/目录, 对应的地址在 https://github.com/facebook/folly/tree/master/folly/concurrency.

folly库默认安装是静态库, 所以只需要在开发环境安装就可以了, 这里我只讲解在ubuntu 16.04+ 下的安装, 关于测试相关的安装, 需要依赖于googletest, 这些也不打算讲.

(1) 安装一些依赖包:

sudo apt-get install \
g++ \
cmake \
libboost-all-dev \
libevent-dev \
libdouble-conversion-dev \
libgoogle-glog-dev \
libgflags-dev \
libiberty-dev \
liblz4-dev \
liblzma-dev \
libsnappy-dev \
make \
zlib1g-dev \
binutils-dev \
libjemalloc-dev \
libssl-dev \
pkg-config

(2) 安装一些高级调试功能:

sudo apt-get install \
libunwind8-dev \
libelf-dev \
libdwarf-dev

(3) 下载folly的release包, release包的位置在:

https://github.com/facebook/folly/releases

下载之后, 将压缩包移动到你想要放的位置, 然后解压, 然后进入folly的主目录( 我下载的是folly-2019.05.06.00.tar.gz, 所以我调用的命令是cd folly-2019.05.06.00).

然后就可以编译源代码了, 调用的命令如下:

  mkdir _build && cd _build
cmake ..
make -j $(nproc)
make install # with either sudo or DESTDIR as necessary

这样folly库就安装成功了, 下面简单介绍一下folly库的ConcurrentHashMap的使用.

使用ConcurrentHashMap的代码如下:

#include <folly/concurrency/ConcurrentHashMap.h>
#include <string>
#include <iostream> class Student {
public:
Student(std::string name, int id, std::string email)
: m_name(name), m_id(id), m_email(email)
{} void printSelf() const {
std::cout << "name: " << m_name << " "
<< "id: " << m_id << " "
<< "email: " << m_email << std::endl;
} private:
std::string m_name;
int m_id;
std::string m_email;
}; int main() {
folly::ConcurrentHashMap<std::string, Student> students;
students.insert("Tom", Student("Tom", , "tom@gmail.com"));
students.insert("Lilly", Student("Lilly", , "lilly@gmail.com")); for (const auto& st : students) {
st.second.printSelf();
}
}

可以调用如下的命令来编译:

g++ follytest.cpp -lfolly -lglog -ldl -ldouble-conversion -lpthread -liberty -o students

运行上述代码的输出如下:

$ ./students
name: Tom id: email: tom@gmail.com
name: Lilly id: email: lilly@gmail.com

这些就是对于folly库的安装和简单使用, 可以作为参考.

如果有什么建议或者提议, 可以提出.

安装folly库以及folly的ConcurrentHashMap的简单使用的更多相关文章

  1. [原创]CentOS6.4编译安装Facebook的folly库(gcc4.8.1boost1.5.3)

      Folly: Facebook Open-souce LibrarY,Facebook开源的一个基础组件库,据说在大规模的场景中性能较高.目前因为自己负责的系统有几个地方性能较差,因此特意找来看看 ...

  2. C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案

    介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...

  3. C++ folly库解读(三)Synchronized —— 比std::lock_guard/std::unique_lock更易用、功能更强大的同步机制

    目录 传统同步方案的缺点 folly/Synchronized.h 简单使用 Synchronized的模板参数 withLock()/withRLock()/withWLock() -- 更易用的加 ...

  4. CocoaPods升级安装三方库报错

    CocoaPods升级后(最新版本1.0.1),安装第三方库的时候会报如下错误: The dependency `AFNetworking (~> 3.1.0)` is not used in ...

  5. OSX下 pip更新及安装python库

    直接执行安装命令 $ pip install builtwith 提示pip当前版本为7.1.2,要使用"pip install --upgrade pip"升级到8.1.2 $  ...

  6. centos7.0 安装字体库

    最近在centos7.0下用itextpdf将word文档转成pdf时出现字体丢失的情况.网上找了很多资料,各式各样的原因和解决方法.后来经过一番测试发现是centos7.0 minimal没有安装相 ...

  7. 安装numpy库

    1.先安装pip: 下载地址:http://pypi.python.org/pypi/pip#downloads 下载pip-8.1.2.tar.gz(md5,pgp)完成之后,解压到一个文件夹,cm ...

  8. 【转】安装第三方库出现 Python version 2.7 required, which was not found in the registry

    安装第三方库出现 Python version 2.7 required, which was not found in the registry 建立一个文件 register.py 内容如下. 然 ...

  9. CentOS 7 安装字体库 & 中文字体

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效:  如上图可以看出,不仅没有中文字体,连字体 ...

随机推荐

  1. vue使用formData进行文件上传

    本文为博主原创,未经允许不得转载 1.vue页面 <ux-form ref="formRef" layout="vertical"> <ux- ...

  2. Sql server 中将数据行转列列转行(二)

    老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...

  3. [LeetCode] 687. Longest Univalue Path 最长唯一值路径

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  4. [LeetCode] 787. Cheapest Flights Within K Stops K次转机内的最便宜航班

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  5. Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件

    参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...

  6. eslint 验证vue文件 报错 unexpected token =解决方法

    解决方案:.eslintrc更改文件配置 { "extends": [ 'standard' ], "parserOptions": { "parse ...

  7. Qt去掉treeview项的焦点虚线

    项目做到后期,进行局部美化的时候发现了问题,在treeview框选择状态下会有虚线. 其实,不仅是treeview,tableview,listview,乃至button在有焦点的情况下,都会出现虚线 ...

  8. kube-proxy运行机制分析【转载】

    转自:http://blog.itpub.net/28624388/viewspace-2155433/ 1.Service在很多情况下只是一个概念,而真正将Service的作用实现的是kube-pr ...

  9. ERP通过JAVA流的形式将数据传到外围系统

    1.ERP封装数据成XML写入数据库服务器指定文件 --指定相关文件信息 v_file_path := '/u01/test/app/fs1/EBSapps/appl/cux/12.0.0/forms ...

  10. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...