C#中 non thread-safe是如何导致 high CPU usage?

freecodex 2015-02-02 11:15:16
Mark 在博客中有一篇关于用WinDGB来调试某个进程导致CPU高占的文章。在最后Mark这样描述>>
Doing this for the other four threads yields the same result - all of them are trying to access the cache value belonging to the PartnerID value of 230!
At this point I can quite confidently say that I’m sure this is a threading issue related to the non thread-safe Dictionary usage...
他的结论是:CPU高占是由于有4个线程要访问同一个缓存变量。
但是作者并没有说背后的原因,请问下背后的机制,为什么多个线程访问同一个变量会导致CPU高占呢?我的理解是不一定的.
...全文
176 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
freecodex 2015-02-03
  • 打赏
  • 举报
回复
引用 1 楼 Forty2 的回复:
[quote=引用 楼主 u010024618 的回复:] ...为什么多个线程访问同一个变量会导致CPU高占呢?我的理解是不一定的.
是不一定的,这取决于‘访问’具体作了些什么。 另外,原文所指的问题并不是访问一个变量,而是‘访问一个缓存项’,而且那个访问可能会创建项并缓存(原文注释是If it fails we'll populate the cache and return it.)。 没有线程安全保证下,多线程创建项可能导致数据损坏或死锁;多线程写缓存也可能导致Dictionary内部数据被破坏。 而当数据损坏的时候,灾难是不可预测的。举个例子,比如Dictionary内部用了很多的类似代码: for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) { ... } 如果entries[i].next不幸地指向它自己,那么该for循环就是一个死循环,导致CPU高就不奇怪了。 [/quote] 多谢,接着这个问题还请教您一个问题,就是如何如何写线程安全的代码?就您的经验来看,有没有一些通用的规则呢?
Forty2 2015-02-03
  • 打赏
  • 举报
回复
引用 楼主 u010024618 的回复:
...为什么多个线程访问同一个变量会导致CPU高占呢?我的理解是不一定的.
是不一定的,这取决于‘访问’具体作了些什么。 另外,原文所指的问题并不是访问一个变量,而是‘访问一个缓存项’,而且那个访问可能会创建项并缓存(原文注释是If it fails we'll populate the cache and return it.)。 没有线程安全保证下,多线程创建项可能导致数据损坏或死锁;多线程写缓存也可能导致Dictionary内部数据被破坏。 而当数据损坏的时候,灾难是不可预测的。举个例子,比如Dictionary内部用了很多的类似代码: for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) { ... } 如果entries[i].next不幸地指向它自己,那么该for循环就是一个死循环,导致CPU高就不奇怪了。
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

111,132

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧