asio之task_io_service多线程

ops/2024/10/9 15:19:55/

简介

task_io_service运行在多线程情况时,call_stack来管理运行io_service的多个线程

结构

call_stack<Key, Value>
- tss_ptr<context> top_
+Value* contains(Key* k)
+Value* top()
call_stack::context
- Key* key_
- Value* value_
- context* next_
task_io_service_thread_info
+ op_queue<task_io_service_operation> private_op_queue
+ long private_outstanding_work
thread_info_base

其中key为task_io_service,value为task_io_service_thread_info

初始化

是在task_io_service::run中,创建task_io_service_thread_info的局部变量(循环没有退出时一直存在),同时添加到call_stack的栈顶

std::size_t task_io_service::run(boost::system::error_code& ec)
{ec = boost::system::error_code();if (outstanding_work_ == 0){stop();return 0;}thread_info this_thread;this_thread.private_outstanding_work = 0;thread_call_stack::context ctx(this, this_thread);mutex::scoped_lock lock(mutex_);std::size_t n = 0;for (; do_run_one(lock, this_thread, ec); lock.lock())if (n != (std::numeric_limits<std::size_t>::max)())++n;return n;
}

使用

在任务分发时,如果当前调用线程是io线程,则直接调用,否则放入对应的队列中

template <typename Handler>
void task_io_service::dispatch(Handler& handler)
{if (thread_call_stack::contains(this)){fenced_block b(fenced_block::full);boost_asio_handler_invoke_helpers::invoke(handler, handler);}else{// Allocate and construct an operation to wrap the handler.typedef completion_handler<Handler> op;typename op::ptr p = { boost::asio::detail::addressof(handler),boost_asio_handler_alloc_helpers::allocate(sizeof(op), handler), 0 };p.p = new (p.v) op(handler);BOOST_ASIO_HANDLER_CREATION((p.p, "io_service", this, "dispatch"));do_dispatch(p.p);p.v = p.p = 0;}
}

http://www.ppmy.cn/ops/100440.html

相关文章

【html+css 绚丽Loading】 000019 五行轮回剑

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

JavaEE 第16节 线程安全的集合类

目录 前言 顺序表 队列 哈希表 1、Hashtable 2、ConcurrentHashMap&#xff08;重点&#xff09; 前言 本文章主要介绍在多线程环境下&#xff0c;如何线程安全的使用一些常用的集合类&#xff08;顺序表和哈希表&#xff09;。 顺序表 1、自己使用同步锁机制&#xff…

STL中的内存分配器

一、operator new 和 new operator 的区别 1.1、new operator new 运算符是 C 提供的语法糖&#xff0c;用于在堆上动态分配内存并同时调用构造函数初始化对象。 功能: 分配足够的内存来存储对象。调用对象的构造函数&#xff0c;执行初始化。返回指向分配内存的指针。 语法…

【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析

BertSelfOutput 和 BertOutput源码解析 1. 介绍1.1 共同点(1) 残差连接 (Residual Connection)(2) 层归一化 (Layer Normalization)(3) Dropout(4) 线性变换 (Linear Transformation) 1.2 不同点(1) 处理的输入类型(2) 线性变换的作用(3) 输入的特征大小 2. 源码解析2.1 BertSe…

kali 设置 时区

kali 设置 时区 在Kali Linux中设置时区可以通过以下步骤进行&#xff1a; 打开终端。 输入以下命令来查看可用的时区列表&#xff1a; timedatectl list-timezones 找到您所在的城市或地区对应的时区&#xff0c;然后使用以下命令进行设置&#xff08;将Europe/Berlin替换…

redisj集群之哨兵模式

1.redis的高并发可用&#xff1f; 首先可以搭建主从集群&#xff0c;再加上使用redis的哨兵模式。 2. 什么是哨兵模式&#xff1f; 哨兵&#xff08;sentinel&#xff09;模式&#xff1a;可以实现主从集群的自动故障恢复。包含了主从服务的监控、自动故障恢复、通知。 监控…

案例分享—优秀ui设计作品赏析

多浏览国外优秀UI设计作品&#xff0c;深入分析其设计元素、色彩搭配、布局结构和交互方式&#xff0c;以理解其背后的设计理念和趋势。 在理解的基础上&#xff0c;尝试将国外设计风格中的精髓融入自己的设计中&#xff0c;同时结合国内用户的审美和使用习惯&#xff0c;进行创…

IDEA插件支持API调试、接口用例支持一键同步API变更,MeterSphere开源持续测试工具v3.2.0版本发布

2024年8月26日&#xff0c;MeterSphere开源持续测试工具正式发布v3.2.0版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;MeterSphere API Debugger插件支持API调试&#xff0c;接口用例支持一键同步API变更&#xff1b;测试管理方面&#xff0c;在“测试用例”模块中…