当前位置: 首页 > ds >正文

asio中的锁到底严不严重

asio到底有没有锁

asio是有锁的,所以规避锁的写法还是值得研究的

windows中的锁

先来张截图:

dispatch_mutex_主要是为了保护定时器队列和完成端口回调的队列。

保护定时器队列

保护完成端口回调的队列

在PostQueuedCompletionStatus失败时,放入completed_ops_中,以便下一次事件到来,再次尝试从completed_ops_取执行
在这里插入图片描述

windows中 每个线程一个io_context 和 多个线程一个io_context

先来看看 最熟悉的 io_context.run() 的实现:
在这里插入图片描述
只要 do_one函数不返回0,run函数会一直循环下去。run函数实现没有用到锁。再看看do_one函数的实现:

折叠起来的代码不包含锁,那么只有dispatch_required_ 为1时,才会出现锁竞争:

  1. 定时器添加
  2. completed_ops_不为空,即PostQueuedCompletionStatus函数失败(基本不会)

所以在没有大量高频触发的定时器前提下,windows平台 每个线程一个io_context 和 多个线程一个io_context 性能基本没有区别。

linux中的锁

先来张截图:
在这里插入图片描述
mutex_为了保护内部数据,这个注释给人的第一感觉就是 锁范围明显要比windows要大了。

保护Proactor回调的队列

在这里插入图片描述

linux中 每个线程一个io_context 和 多个线程一个io_context

先来看看 最熟悉的 io_context.run() 的实现:

只要 do_one函数不返回0,run函数会一直循环下去。首先锁住do_run_one函数,再看看do_one函数的实现:

简单看一下,折叠的代码里面调用的是epoll_wait。
如果有多个回调operation需要处理则 more_handlers=true,且有多个线程则 one_thread_=false,那么唤醒一个线程且释放锁,让其他线程再去抢剩余的回调operation。
所以Linux平台最好使用 1 io_context per thread 模型 避免锁带来的影响,io_context 构造时传入1,asio内部会有针对的优化,比如 one_thread_的值会变成true。

http://www.xdnf.cn/news/11485.html

相关文章:

  • 拟合是什么意思
  • 转载--Linux下Modules的概念及使用详解
  • 什么是域名 --每天一个小知识
  • DFA 的化简
  • 一. NSIS介绍
  • 初探BFF架构
  • AutoGPT怎么用?一文配置自己的AutoGPT!
  • JavaScript中object对象
  • 私藏的18个黑科技网站,想找什么软件就找什么软件!!!
  • Java里什么是POJO
  • Css---vertical-align 属性的用法与应用
  • 【整理】TAC码是什么?TAC码和IMEI有什么关系?
  • 数据结构-二维数组
  • HTTP代理和SOCKS代理
  • Fortran语言的入门与心得
  • BST(二叉搜索树)
  • finalize方法_finalize()方法详解
  • HLS RTSP RTMP的区别
  • java injection_injection(注入)
  • MySql下载和安装
  • Linux基础知识汇总,收藏
  • 推荐几个精致的web UI框架及常用前端UI框架(1),web开发进阶
  • 各类编程语言的历史以及现状发展情况
  • jquery实现移动端slotmachine抽奖游戏,中奖后并弹出地址填写框
  • 常见CMS系统总结
  • 【图割】最大流最小切割的最直白解读
  • Cadence Allegro如何修改原点位置
  • Win10 + Ubuntu 双系统完美避坑删除 Ubuntu 教程_win10和ubuntu双系统删除ubuntu(1)
  • 使用MFC实现WIN10的气泡提示
  • 显示农历天气时钟小部件下载_安卓最强桌面小部件:Zooper Widget