如何证明多线程有效?

C. *_*oss 3 c# testing multithreading

如何证明多线程在我的C#程序中有效?这是针对测试要求的.例如,我将不得不在记录器类中添加一些锁定(是的,我知道,我不应该编写自己的日志类),我需要一个测试用例来证明更改是有效的.

Jef*_*nal 7

如果要测试锁定代码是否正确同步对日志的访问,则需要构建可确保争用的测试.这可能需要您重构代码,以便您可以注入一个模拟日志编写器类,该类可以在任意时间段内保存日志锁.

这是一个广泛的主题,你可以在StackOverflow上找到几个相关的问题,这些都值得一读:

CHESS是一个正在开发的框架,用于识别"断言违规,死锁,活锁,数据争用和内存模型错误".我实际上并没有使用它,但看起来它可能非常有用.


csh*_*net 5

嗯,这可能听起来不对,但事实是你不能证明单元测试的多线程行为.话虽如此,您可以通过测试获得对代码的信心,并且随着时间的推移它可能实际上存在问题.

<rant>多线程代码是我在许多项目中存在的祸根.通常,人/开发人员没有做好工作所需的专业知识.在任何人在野外看到它之前,虫子经常被忽视很长一段时间,然后你无法重现这个问题来识别最新情况.此外,尝试通过调试"修复"损坏的多线程代码通常不是一种可行的方法.</咆哮>

无论如何,继续进行测试,做这么多并没有什么坏处,这很容易做到.只需启动N个线程,让它们等待一个ManualRestEvent,然后在一个紧凑的循环中调用你的api几十万次:). 但首先我会建议团队中的每个人都进行代码审查. 遍历每行代码,思考它并行执行.问你自己:

  1. 我真的需要这个锁()吗?
  2. 锁()中必须包含的代码量最少?
  3. 我可以使这个对象/状态不可变并避免锁定吗?
  4. 调用者有没有办法让代码在锁内执行?
  5. 检查在"volatile"锁定内访问和更改的所有成员?
  6. 你正确使用System.Threading.Thread.MemoryBarrier吗?
  7. 如果涉及多个锁,它们总是以相同的顺序获得?
  8. [wiki add here]