首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GO中的并发编程测试

GO中的并发编程测试
EN

Stack Overflow用户
提问于 2013-11-28 18:05:39
回答 2查看 622关注 0票数 4

我试图确保我的并发程序没有以下内容,

  • 死锁
  • 活锁
  • 饥饿

我找到了以下工具http://blog.golang.org/race-detector

我试着使用启用的-race编译和运行,没有看到任何抱怨。

有没有人知道这是否检查了上述所有问题?在输出中没有收到任何投诉是否意味着程序没有这些问题?

EN

回答 2

Stack Overflow用户

发布于 2013-11-29 09:28:20

死锁、活锁和饥饿不能单独通过测试来消除,而Go竞赛检测器也不能检测到它们。在运行时将检测到Go程序中的死锁,但通常为时已晚。Livelocks (不终止繁忙循环)将不会被检测到,除非它们还会导致死锁。

线程饥饿类似于动态锁,因为应用程序中的不平衡忙碌会导致某些活动受到阻碍,并且永远不会取得预期的进展。彼得·韦尔奇的著名的“没有鸡吗?”就是一个例子。

竞赛检测器本身的实用性受到限制,因为某些竞赛条件取决于环境,而导致某一特定种族的条件在测试阶段可能不存在,因此竞赛检测器会错过它们。

如果这一切听起来相当黯淡的话,那么有大量的理论工作可以提供很大帮助。前提是这四个动态问题最好通过设计策略和语言特性来解决,而不是通过测试。作为一个简单的例子,Occam编程语言(就像它的并发模型中的Go )有一个由编译器强制执行的并行使用规则,它消除了竞争条件。这对程序员施加了限制:不允许为可变状态(即指针)提供别名。

Go (和Occam)中的线程饥饿问题也不应该像Java中的问题那样严重,因为并发模型设计得更好。除非你滥用select,否则这不会是个问题。

死锁最好通过基于理论的设计模式来解决。例如,Martin & Welch发布了一种无死锁并发系统的设计策略,主要描述了客户机-服务器策略和i/o-par策略。这是针对Occam程序的,但也适用于Go。客户机服务器策略很简单:将您的Go例程网络描述为一组通信服务器及其客户端;确保网络图中没有循环,=>死锁被消除。I/o-par是一种形成套路环和套路的方法,这样就不会在结构中出现死锁。

票数 6
EN

Stack Overflow用户

发布于 2013-11-28 18:08:57

比赛探测器没有从你的名单上检查任何东西。它检查蕾丝写到记忆中。(Sidenote:运行时检测到Goroutine死锁。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20272405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档