自动验证一些线程限制? (C#)

Posted

技术标签:

【中文标题】自动验证一些线程限制? (C#)【英文标题】:Automatically verify some threading restrictions? (C#) 【发布时间】:2010-01-25 16:01:29 【问题描述】:

我们的代码库有很多在 cmets 中编码的线程限制 - 例如:

此类是线程安全的(可以从任何线程安全地访问所有公共方法) 必须锁定“xyz”才能访问/调用任何公共成员 只能从线程“xyz”访问(通常但并不总是指的是 GUI 线程) 如果两者都需要,则必须在锁定“xyz”之后使用此锁定

前三个可以在班级和个人成员中看到。

我已经搜索了至少可以部分验证这些约束是否得到满足的任何解决方案。我意识到这可以自动完成的程度有很大的限制,但即使是工具的一点帮助也会有帮助。不过我没找到。

你能推荐一个工具来做这些事情吗?也许是通过将上述限制编码为属性来工作的 FxCop 规则集?

【问题讨论】:

【参考方案1】:

我不知道任何线程安全特定属性,只是因为它通常太复杂。并且“测试”线程代码(添加额外的Debug.Assert 等)是 heisenbugs 的常见原因。你可以看看“CHESS”吗?这不是灵丹妙药,但可能会有所帮助。

【讨论】:

我确实偶然发现了 CHESS,并打算在下次出现问题时尝试一下。听起来我所追求的不存在。无论如何还没有 - 希望像 springerlink.com/content/877541x4p9151668 这样的研究最终会改变这一点。【参考方案2】:

不确定在编译时如何执行此操作,但也许PostSharp 可用于定义约束,而不是将它们放入 cmets(例如,您的约束可以指定为方法或类的属性) .

【讨论】:

【参考方案3】:

您可能会尝试实现一些 FxCop 自定义规则(使用适当的属性触发)。这可能会帮助您验证一些简单的状态(例如,此类是线程安全的,因为它不包含可变状态)。

其他验证可能会更困难(例如,FxCop 是否可以验证当设置字段“X”时它总是在我们持有给定锁时这样做) - 也许。如果这很重要,我建议查看 FxCop SDK,看看这样的测试有多难。

我发现实现自定义 FxCop 规则非常有用,尤其是当我们控制正在测试的类的结构时。

【讨论】:

以上是关于自动验证一些线程限制? (C#)的主要内容,如果未能解决你的问题,请参考以下文章

h5短信验证码自动填充时总是被复制两遍

在 Caliburn.Micro 中自动验证属性

派生时的自动类装饰(或验证)

网站访问限制

iOS收据验证 - 自动续订订阅

按键精灵脚本中如何自动识别并输入验证码