moduo之线程本地存储

简介

用于多线程私有数据操作

结构

ThreadLocal<T>
- pthread_key_t pkey_
+ThreadLocal()
+~ThreadLocal()
+T& value()
ThreadLocalSingleton<T>
- static __thread T* t_value_
- static Deleter deleter_
+static T& instance()
+static T* pointer()
-static void destructor(void* obj)
Deleter
- pthread_key_t pkey_
+Deleter()
+~Deleter()
+void set(T* newObj)

ThreadLocal

构造函数

创建pthread_key,指定存储单元的释放处理函数

ThreadLocal()
{
  MCHECK(pthread_key_create(&pkey_, &ThreadLocal::destructor));
}

private:

  static void destructor(void *x)
  {
    T* obj = static_cast<T*>(x);
    typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
    T_must_be_complete_type dummy; (void) dummy;
    delete obj;
  }

析构函数

删除pthread_key

~ThreadLocal()
{
  MCHECK(pthread_key_delete(pkey_));
}

设置/获取存储值

先看线程本地存储是否有设置,如果没有,分配内存,设置本地存储

T& value()
{
  T* perThreadValue = static_cast<T*>(pthread_getspecific(pkey_));
  if (!perThreadValue)
  {
    T* newObj = new T();
    MCHECK(pthread_setspecific(pkey_, newObj));
    perThreadValue = newObj;
  }
  return *perThreadValue;
}

ThreadLocalSingleton

单例

分配内存,通过Deleter在线程退出时,释放分配的内存

static T& instance()
  {
    if (!t_value_)
    {
      t_value_ = new T();
      deleter_.set(t_value_);
    }
    return *t_value_;
  }

获取存储地址

static T* pointer()
{
  return t_value_;
}

Deleter

具体调用pthread_key相关的类

Deleter()
{
  pthread_key_create(&pkey_, &ThreadLocalSingleton::destructor);
}

~Deleter()
{
  pthread_key_delete(pkey_);
}

void set(T* newObj)
{
  assert(pthread_getspecific(pkey_) == NULL);
  pthread_setspecific(pkey_, newObj);
}
### 关于 muduo 库的使用说明 #### 一、muduo 库简介 `muduo` 是一个基于 C++ 的高性能网络编程库,主要用于开发高并发服务器应用。它提供了线程池模型、事件循环机制以及多种实用工具类,简化了多线程环境下的网络通信实现[^1]。 --- #### 二、文档下载与获取 官方文档通常可以通过访问 `muduo` 的 GitHub 页面或其他开源托管平台获得。以下是常见的资源位置: - **GitHub 地址**: https://github.com/chenshuo/muduo 在此页面上可以找到项目的 README 文件以及其他相关文档[^2]。 如果需要离线版本的文档,可以在克隆仓库后查看其内部自带的 Markdown 或 HTML 格式的文档文件。 --- #### 三、安装流程 ##### 1. 获取源码 通过 Git 命令拉取最新版的 `muduo` 源代码: ```bash git clone https://github.com/chenshuo/muduo.git cd muduo ``` ##### 2. 编译依赖项 确保已安装必要的构建工具链和第三方库,例如 GCC/Clang 和 Boost 等。具体命令如下: ```bash sudo apt-get update && sudo apt-get install cmake g++ libboost-all-dev ``` ##### 3. 构建项目 进入根目录运行以下脚本完成初始化配置及编译操作: ```cmake mkdir build && cd build cmake .. make -j$(nproc) ``` 上述过程会自动生成目标可执行文件及其动态链接库。 --- #### 四、CMakeLists.txt 配置详解 为了支持示例程序的生成,在顶层 `CMakeLists.txt` 中需加入特定选项控制开关逻辑: ```cmake if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() # 只有当当前工程名称等于 'muduo' 才允许启用例子模块 if(CMAKE_PROJECT_NAME STREQUAL "muduo") option(MUDUO_BUILD_EXAMPLES "Build Muduo examples" ON) endif() ``` 此片段定义了一个名为 `MUDUO_BUILD_EXAMPLES` 的布尔变量,默认开启状态为真(`ON`)表示同时制作测试案例部分;反之则忽略它们的存在。 --- #### 五、创建并编译示例程序 按照惯例新建子文件夹存放个人定制化代码段落,并调整工作路径至对应区域以便后续处理动作顺利开展下去: ```bash mkdir examples && cd examples touch my_example.cpp nano my_example.cpp # or your preferred editor ``` 接着参照既有模板填充实际功能实现细节之后再次调用先前提到过的那一套标准指令序列即可得到最终产物形式。 --- #### 六、简单实例展示 下面给出一段基础框架结构供参考学习之用: ```cpp #include "muduo/net/TcpServer.h" using namespace muduo; using namespace muduo::net; int main(){ EventLoop loop; InetAddress listenAddr(9981); TcpServer server(&loop,listenAddr,"EchoServer"); server.setConnectionCallback([](const TcpConnectionPtr& conn){ LOG_INFO << (conn->connected() ? "UP":"DOWN"); }); server.setMessageCallback([](TcpConnectionPtr&, Buffer* buf,Timestamp){ std::string msg(buf->retrieveAllAsString()); printf("recv %zd bytes\n",msg.size()); }); server.start(); loop.loop(); return 0;} ``` 以上展示了如何利用 `muduo` 创建基本 TCP Server 并监听端口等待客户端连接请求的过程概述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值