安裝folly庫以及folly的ConcurrentHashMap的簡單使用


我在寫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", 1, "tom@gmail.com"));
    students.insert("Lilly", Student("Lilly", 2, "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: 1 email: tom@gmail.com
name: Lilly id: 2 email: lilly@gmail.com

這些就是對於folly庫的安裝和簡單使用, 可以作為參考.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM