程序有并发错误?NO WAY!

什么是并发错误

并发是指程序能够交替执行不同的任务,以达到"同时执行效果",加快程序的运行效率。

但是并发也会导致一系列问题,以变量+1赋值为例,由于操作实际由多条指令组成,不同任务执行指令的顺序可能是交错的,所以就可能出现执行结果与我们预期结果不符合的情况。

并发错误很难捕获。这是因为触发并发错误需要线程以特定的顺序并行执行指令,以使程序显示错误行为。此外,触发并发错误具有不确定性。即使在触发并发错误之后,由于非确定性,将其重现并调试也可能很困难。

如果您是.NET开发者,可以尝试使用Coyote来自动检测并发错误。

Coyote

Coyote是由微软研究院提供的一个.NET库,旨在帮助确保您的代码没有并发错误。

Coyote的核心是一个调度器,它在测试期间控制(通过二进制重写)程序的执行,并且能够系统地研究并发性和不确定性,以发现安全性和活跃性缺陷。

更为重要的是,一旦Coyote发现一个错误,一旦 Coyote 发现了一个错误,它就可以让您根据需要多次完全重现它,从而使调试和修复问题变得更加容易。

你可以运行下面的命令安装Coyote:

dotnet tool install --global Microsoft.Coyote.CLI

下面我们用官方示例程序https://github.com/microsoft/coyote-samples来体验一下Coyote的强大功能。

定位错误

首先,clone下代码后,运行下列命令进行编译示例程序代码:

powershell -f build.ps1

运行下列命令进行错误检查:

cd bin\net5.0\coyote rewrite BoundedBuffer.dllcoyote test BoundedBuffer.dll -m TestBoundedBufferMinimalDeadlock --iterations 100

测试完成后,将会提示发现错误,如下图: 

您将得到一个解释所有这些的日志文件:

<ErrorLog> Deadlock detected. Task(0) is waiting for a task to complete, 
but no other controlled tasks are enabled. 
Task(1), Task(2) and Task(3) are waiting to acquire a resource that is already acquired, 
but no other controlled tasks are enabled.
<StackTrace>    at Microsoft.Coyote.Tasks.SynchronizedBlock.Mock.Wait()at BoundedBufferExample.BoundedBuffer.Take()

解决问题

通过错误日志的StackTrace,定位到出错代码:

while (this.Occupied == 0)
{Monitor.Wait(this.SyncObject);
}

然后看看释放SyncObject的代码:

 Monitor.Pulse(this.SyncObject);

根据错误日志的ErrorLog,并对照官方文档的解释,只需要把Pulse替换成PulseAll即可解决问题:


结论

通过上面的示例,我们可以看到,未对代码做任何修改,就可以实现并发错误检测。

如果您对项目中的多线程代码不太放心,可以尝试使用Coyote来帮助检测,避免上线出现并发错误的可能性。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

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

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

相关文章

好好珍惜今生,不要期待来世……

亲情经不起冷漠&#xff0c;爱情经不起谎言&#xff0c;友情经不起虚伪。再好的缘份也经不起敷衍&#xff0c;再深的感情也需要珍惜。没有绝对的傻瓜&#xff0c;只有愿为你装傻的人&#xff0c;原谅你的人&#xff0c;是不愿失去你的世界。一辈子真的好短好短…… 有多少人说好…

NET问答: C# 中是否有 format json 的类库?

咨询区 mpen&#xff1a;我在寻找一个 function&#xff0c;它能够接收 string 格式的json&#xff0c;并且能够以 换行缩进 的形式输出&#xff0c;比如&#xff1a;{"status":"OK", "results":[ {"types":[ "locality", &…

图像柔光效果(SoftGlow)的原理及其实现。

图像柔光效果在很多商业软件中都有实现&#xff0c;比如美图秀秀&#xff0c;光影魔术手等。其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果&#xff0c;给人一种朦胧美&#xff0c;如下面几幅图所示&#xff1a; 目前&#xff0c;关于该算法的可控参数&#xff…

中小学招生强化就近入学;首次全女性太空行走取消;苹果付费新闻APP奔溃;NASA火星上发现鹅卵石;这就是今天的大新闻...

今天是3月27日农历二月廿一今天星期三有点闷已经开始用空调了下面是今天的大新闻中小学招生强化就近入学&#xff08;北京商报&#xff09;中小学秋季入学新生招生已经陆续开始&#xff0c;近日&#xff0c;教育部办公厅也紧随其后&#xff0c;印发了《关于做好2019年普通中小学…

python如何安装扩展库openpyxl和numpy_Python第三方库之openpyxl(2)

Python第三方库之openpyxl(2)简单的使用写一个工作簿>>> from openpyxl importWorkbook>>> from openpyxl.compat importrange>>> from openpyxl.utils importget_column_letter>>>>>> wb Workbook()>>>>>> de…

[翻译]在GC上加入DPAD

本文90%通过机器翻译&#xff0c;另外10%译者按照自己的理解进行翻译&#xff0c;和原文相比有所删减&#xff0c;可能与原文并不是一一对应&#xff0c;但是意思基本一致。译者水平有限&#xff0c;如果错漏欢迎批评指正译者Bing Translator、InCerry&#xff0c;另外感谢Hex、…

SQL 结合CASE WHEN 实现二维统计

在开发中往往要用到类似下面的二维统计&#xff1a; abtype15465type25454在SQL中使用CASE WHEN 语句可以很轻松的实现&#xff1a; SELECT SUM(CASE WHEN typetype1 THEN 1 ELSE 0 END) AS a ,SUM(CASE WHEN typetype2 THEN 1 ELSE 0 END) AS b FROM Table1 转载于:https://ww…

phpfind mysql怎么用_MySQL 的 find_in_set 函数使用方法

举个例子来说&#xff1a;有个文章表里面有个type字段&#xff0c;它存储的是文章类型&#xff0c;有 1头条、2推荐、3热点、4图文...1,12,13 等等 。现在有篇文章他既是 头条&#xff0c;又是热点&#xff0c;还是图文&#xff0c;type中以 1,3,4 的格式存储。那我们如何用sql…

美国Thinkfun的“编程三剑客”少儿编程从入门到精通

▲数据汪特别推荐点击上图进入玩酷屋学编程现在有多火&#xff0c;小木就不多说啦&#xff01;很多爸爸妈妈都想让小朋友早点接触编程&#xff0c;掌握这门未来世界的通用“语言”&#xff0c;但又怕太早使用电脑、iPad等电子产品&#xff0c;影响孩子视力。今天给大家推荐一套…

解决scrollViewDidScroll do not work的方法

2019独角兽企业重金招聘Python工程师标准>>> 别忘记在在包含了scrollView的ViewController中的viewDidload方法中设置scrollView的delegate [self.scrollView setDelegate:self]; 关于delegate&#xff1a;一般一个ui的delegate都在其父类中指定 view.delegateself…

基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

围绕DDD和ABP Framework两个核心技术&#xff0c;后面还会陆续发布核心构件实现、综合案例实现系列文章&#xff0c;敬请关注&#xff01; ABP Framework 研习社&#xff08;QQ群&#xff1a;726299208&#xff09; ABP Framework 学习及实施DDD经验分享&#xff1b;示例源码、…

mysql isam 食物_MySQL常用存储引擎之MyISAM

1. mysql 5.5之前版本默认存储引擎1.1 因为这个原因现在还有大量服务器在使用这myisam引擎的表1.2 myisam是mysql大部分系统表和临时表使用的存储引擎2. myisam存储引擎表由myd和myi组成2.1 myd存储数据信息2.2 myi存储索引信息2.3 frm记录表结构的&#xff0c;所有存储引擎都有…

每日一笑 | 史上最贴心的骗子

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑

系列文章基于ABP落地领域驱动设计-01.全景图基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则基于ABP落地领域驱动设计-05.实体创建和更新最佳实践…

Python 学习笔记(三)Function

python引用变量的顺序&#xff1a; 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 1. Scope: • If a variable is assigned inside a def, it is local to that function.• If a variable is assigned in an enclosing def, it is non…

python xpath定位不到_Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)...

#codingutf-8Created on 2016-7-20author: JenniferProject:登录百度账号from selenium importwebdriverimporttimedriver webdriver.Firefox()driver.get("http://www.baidu.com/")time.sleep(3)#点击登录&#xff1a;有些name为tj_login的元素为不可见的&#xff0…

基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则

dotNET兄弟会 专注.Net开源技术及跨平台开发&#xff01;致力于构建完善的.Net开放技术文库&#xff01;为.Net爱好者提供学习交流家园&#xff01;公众号 围绕DDD和ABP Framework两个核心技术&#xff0c;后面还会陆续发布核心构件实现、综合案例实现系列文章&#xff0c;敬请…

我国最新十大黑科技发布,颠覆你的想象!

全世界只有3.14 % 的人关注了数据与算法之美人工智能的飞速发展&#xff0c;让“黑科技”一词深入人心。目不暇接的各种前沿技术&#xff0c;一再刷新人们的认知世界。所谓“黑科技”&#xff0c;不仅仅要够炫酷&#xff0c;更要有足够的“生活温度”&#xff0c;实现真正的人性…

javascript理论篇(详情见地址)

一篇很精彩的javascript理论知识 http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html转载于:https://www.cnblogs.com/jangwewe/p/3161020.html

mock java_JAVA的mock工具mockito简介

在测试过程中&#xff0c;难免会碰到交互的外围系统不给力的情况&#xff0c;这时候mock就派上用场了&#xff0c;前段时间跟同学聊到这块的时候&#xff0c;他向我推荐mockito这个mock工具&#xff0c;试用了一下&#xff0c;确实很好用&#xff0c;这里给大家介绍下这款工具&…