nng协议nni_taskq_sys_init(void) 对nni_taskq_systq 初始化

        函数调用关系:nni_init(void)  --> nni_plat_init(nni_init_helper) 今天分析的函数位于 nni_init_helper()函数中的 nni_taskq_sys_init() 。  这个函数主要用于针对 全局变量  nni_taskq_systq 进行申请空间并初始化。 

1. 确定线程数量 num_thr  

        这个通过宏定义或者函数获得。 没定义则取CPU数量 * 2; 最大值为16. 如果小于2, 则指定num_thr 的值为2. 最少2个,最多16个。 

2.执行初始化   nni_taskq_init(&nni_taskq_systq, num_thr)

nni_taskq 的定义:

struct nni_taskq_thr{nni_taskq *tqt_tq;nni_thr    tqt_thread;
}  struct    nni_taskq {nni_list       tq_tasks;nni_mtx        tq_mtx;nni_cv         tq_sched_cv;nni_cv         tq_wait_cv;nni_taskq_thr  *tq_threads;int            tq_nthreads;bool           tq_run;
}

基本步骤:

1. 为tq 申请空间, 为tq->tq_threads  申请内存空间

2. 对线程数量赋值,tq->tq_nthreads = nthr .

3. 链表初始化   nni_taskq_systq->tq-tasks 互斥锁初始化, 条件变量初始化

//请详细分析并给出使用范例
nni_mtx_init(&tq->mtx);
nni_cv_init(&tq->tq_sched_cv, &tq->tq_mtx);
nni_cv_init(&tq->tq_wait_cv, &tq->tq_mtx);

4. 循环对全局变量nni_taskq_systq 的成员变量 所有的  tq_threads[i] 进行初始化。

5. th_threads[i] 的初始化流程:

        tq->th_threads[i].tqt_tq = tq;

        执行nni_thr_init tqt_thread[i].tqt_thread 进行初始化。 这个函数和其他的初始化类似,首先对第一层变量进行赋值,然后调用nni_plat_thr_init,初始化后的值为:

//tq的类型是  nni_taskq  *tq;
nni_thr_init(&tq->tq_threads[i].tqt_thread, nni_taskq_thread, &tq->tq_threads[i]);tq->tq_threads[i].tqt_tq = tq;&tq->tq_threads[i].tqt_thread 的类型是nni_thr
//nni_thr_init
tq->tq_threads[i].tqt_thread->done  = 0;
tq->tq_threads[i].tqt_thread->start = 0;
tq->tq_threads[i].tqt_thread->stop  = 0;
tq->tq_threads[i].tqt_thread->fn    = nni_taskq_thread;
tq->tq_threads[i].tqt_thread->arg   = &tq->tq_threads[i];//tq->tq_threads[i].tqt_thread->thr的类型是 nni_plat_thr//nni_plat_thr_init(&thr->thr, nni_thr_wrap, thr)
tq->tq_threads[i].tqt_thread->thr->func = nni_thr_wrap;
tq->tq_threads[i].tqt_thread->thr->arg  = tq->tq_threads[i].tqt_thread;

在nni_plat_thr_init(nni_plat_thr *thr, void (*fn)(void *), void *arg)中创建线程,执行线程函数:nni_plat_thr_main(void *arg);

在线程函数中调用函数指针:thr->func(thr->arg);  也就是nni_plat_init  初始化的thr->func 亦即:nni_thr_wrap,参数是nni_plat_init 中设置的参数,这里是  &tq->tq_threads[i];由于初始化时,start==0, stop==0 所以函数将等待在条件变量上。

static void
nni_thr_wrap(void *arg)
{nni_thr *thr = arg;int      start;nni_plat_mtx_lock(&thr->mtx);while (((start = thr->start) == 0) && (thr->stop == 0)) { //初始化条件,函数将等待在条件变量nni_plat_cv_wait(&thr->cv);}nni_plat_mtx_unlock(&thr->mtx);if ((start) && (thr->fn != NULL)) {thr->fn(thr->arg);}nni_plat_mtx_lock(&thr->mtx);thr->done = 1;nni_plat_cv_wake(&thr->cv);nni_plat_mtx_unlock(&thr->mtx);
}

在 nni_taskq_init 的最后,这里将执行nni_thr_run 函数,设置条件 start == 1 并唤醒等待在条件变量上的线程。

for (int i = 0; i < tq->tq_nthreads; i++) {nni_thr_run(&tq->tq_threads[i].tqt_thread);
}

函数继续执行,调用  nni_taskq_thread函数,参数是  &tq->tq_threads[i] ;

执行简图请参考resolv_thr 的初始化

static void
nni_taskq_thread(void *self)
{nni_taskq_thr *thr = self;nni_taskq     *tq  = thr->tqt_tq;nni_task      *task;nni_thr_set_name(NULL, "nng:task");nni_mtx_lock(&tq->tq_mtx);for (;;) {if ((task = nni_list_first(&tq->tq_tasks)) != NULL) {nni_list_remove(&tq->tq_tasks, task);nni_mtx_unlock(&tq->tq_mtx);task->task_cb(task->task_arg);nni_mtx_lock(&task->task_mtx);task->task_busy--;if (task->task_busy == 0) {nni_cv_wake(&task->task_cv);}nni_mtx_unlock(&task->task_mtx);nni_mtx_lock(&tq->tq_mtx);continue;}if (!tq->tq_run) {break;}nni_cv_wait(&tq->tq_sched_cv);}nni_mtx_unlock(&tq->tq_mtx);
}

        

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm 命令的简写,以及-d、-g、-s后缀的区别,和packages.json文件中dependencies和devDependencies的区别

​ 一、npm命令的简写 npm install 等价于 npm inpm install XXX --save 等价于 npm i XXX -S 等价于 npm i XXX -snpm install XXX --save-dev 等价于 npm i XXX -D 等价于 npm i XXX -dnpm install XXX --global 等价于 …

机器学习(二十一):错误分析、创造数据和迁移学习

一、错误分析 假设交叉验证集一共有500个数据点&#xff0c;模型拟合结果中&#xff0c;有100个数据点有误。 错误分析就是&#xff0c;手动地分析这100个错误数据&#xff08;或随机选择一些错误数据&#xff09;&#xff0c;根据它们的共同属性、共同特征分类&#xff0c;然…

在QT中使用多线程并发服务器(C++)

什么是多线程并发服务器&#xff1f;在QT里如何使用多线程并发服务器呢&#xff1f; 多线程并发服务器是一种网络服务器设计&#xff0c;它能够同时处理多个客户端的请求。在多线程服务器中&#xff0c;主线程负责监听和接受来自客户端的连接请求&#xff0c;每当有一个新的连…

C++(week13): C++基础: 标准模板库 STL

文章目录 零、标准模板库 STL一、容器 (Container)1.序列式容器(1)vector2.五种遍历10.vector的迭代器失效问题 (2)deque(3)list 2.关联式容器(1)set4.set的查找(2)find() 8.set中存储自定义类型&#xff1a;三种方法 (2)multiset7.multiset的特殊操作&#xff1a;bound系列函数…

【前端 15】Vue生命周期

Vue生命周期 在Vue.js中&#xff0c;了解组件的生命周期对于开发者来说是至关重要的。Vue的生命周期指的是Vue实例从创建到销毁的一系列过程&#xff0c;每个阶段都对应着特定的生命周期钩子&#xff08;或称为生命周期方法&#xff09;&#xff0c;允许我们在不同的时间点加入…

SQL Server 端口设置教程

引言 你好&#xff0c;我是悦创。 在配置 SQL Server 的过程中&#xff0c;设置正确的端口非常关键&#xff0c;因为它影响到客户端如何连接到 SQL Server 实例。默认情况下&#xff0c;SQL Server 使用 TCP 端口 1433&#xff0c;但在多实例服务器上或出于安全考虑&#xff…

【网络安全】AWS S3 Bucket配置错误导致敏感信息泄露

未经许可&#xff0c;不得转载。 文章目录 前言技术分析正文 前言 AWS&#xff08;Amazon Web Services&#xff09;是亚马逊公司提供的一个安全的云服务平台&#xff0c;旨在为个人、公司和政府机构提供计算能力、存储解决方案、内容交付和其他功能。作为全球领先的云服务提供…

Autodesk Revit v2025 激解锁版下载及安装教程 (三维建模软件)

前言 Revit是欧特克公司知名的三维建模软件&#xff0c;是建筑业BIM体系中使用最广泛的软件之一&#xff0c;其核心功能是三维建筑模型参数化设计、渲染效果图、算量&#xff0c;土建建模、机电建模、用来帮助工程师在施工前精确模拟阶段。 一、下载地址 下载链接&#xff1…

体育赛事中的AI运用

7月24日&#xff0c;国际奥委会&#xff08;IOC&#xff09;举办了新闻发布会&#xff0c;宣布计划在2024年巴黎奥运会上展示一系列创新的人工智能&#xff08;AI&#xff09;技术。这次会议不仅是对即将到来的奥运赛事的预热&#xff0c;也深入探讨了人工智能在体育领域可能带…

【Rust光年纪】探索Rust语言中的数据压缩与解压:六款优秀库全面评测

深度剖析&#xff1a;Rust语言中的六款顶尖压缩解压库 前言 在软件开发中&#xff0c;数据压缩和解压是十分常见的需求。随着Rust语言的流行&#xff0c;越来越多的开发者开始寻找适用于Rust的压缩和解压库。本文将介绍几个用于Rust语言的压缩和解压库&#xff0c;包括它们的…

快速重装系统

挑选系统 https://d1506.xy58.net/202002/Js_GhostWin7z_x64_2020T.iso WIN11镜像 安装PE启动U盘安装工具 本地安装

【机器学习】深入理解损失函数(Loss Functions)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

【C++】set的使用

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f308;关于set&#x1f525;容量函数emptysize &#x1f525;Modifiersinserteraseclear &#x1f525;Operationsfindcountlower_bound和upper_…

计算机本科,硕士如何入门生信

参考 该如何自学入门生物信息学-&#xff08;很好的入门指导&#xff09; 【【推荐课程】北京大学生物信息学:学习方法(完整带课件&#xff09;】 AI 作为计算机本科背景的硕士生&#xff0c;入门生物信息学&#xff08;生信&#xff09;的过程可以按以下步骤进行&#xff1a…

前端必知必会-head元素

文章目录 HTML - Head 元素HTML <title> 元素HTML <style> 元素HTML <link> 元素HTML <meta> 元素设置viewportHTML <script> 元素HTML <base> 元素总结 HTML - Head 元素 HTML <head> 元素是以下元素的容器&#xff1a;<title&…

Lesson 51 A pleasant climate

Lesson 51 A pleasant climate 词汇 Greece n. 希腊 Greek a. 希腊的&#xff0c;希腊语 搭配&#xff1a;Greek gift 不怀好意的礼物 例句&#xff1a;他的电脑是不怀好意的礼物。    His computer is a Greek gift. climate n. 气候 长时间&#xff0c;不容易更改的 we…

一键将桌面资料存到d盘的工具,小巧、绿色、免费、免安装

为了提升我们的系统稳定性以及资料的安全性&#xff0c;建议大家将电脑桌面的资料默认路径设置为D盘或其他磁盘&#xff0c;这样不仅会减少系统盘的占用空间&#xff0c;在系统盘出现故障时我们还可以通过pe工具备份桌面的资料。虽然我们也可以通过一些操作来修改桌面文件以及我…

【Unity UGUI】Button组件:点击之间,触发无限可能

在Unity的UGUI系统中&#xff0c;Button组件是构建交互式用户界面不可或缺的元素。它不仅响应用户的点击操作&#xff0c;还可以通过视觉效果和声音反馈增强用户体验。本文将详细介绍Button组件的使用方法、自定义技巧以及如何利用它创建响应式设计。 Button组件简介 Button是…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电动汽车动态拥堵的配电网灵活性资源双层优化调度 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

嵌入式Python、决策树算法、SQLite、Flask、树莓派、机器学习:基于算法自主决策的智能家居系统(代码示例)

项目概述 随着物联网技术的快速发展&#xff0c;智能家居系统越来越普及&#xff0c;成为现代家庭生活的重要组成部分。本文将介绍一个基于Raspberry Pi和Arduino的智能家居算法控制系统的硬件平台。该系统能够通过传感器采集环境数据&#xff0c;并利用机器学习算法进行分析与…